星期五, 12月 19, 2008

Restlet + Spring config HOWTO

最近把原先用cxf方式架起來的REST介面改用restlet,搭配freemarker作為顯示用的template engine,以下是相關的設定方式,以及需要注意的地方。

首先是在pom.xml中加入相依性設定:

<dependency>
<groupId>org.restlet</groupId>
<artifactId>org.restlet</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>org.restlet</groupId>
<artifactId>org.restlet.ext.spring</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>org.restlet</groupId>
<artifactId>org.restlet.ext.freemarker</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>com.noelios.restlet</groupId>
<artifactId>com.noelios.restlet.ext.spring</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.14</version>
</dependency>
<dependency>
<groupId>freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.8</version>
<scope>provided</scope>
</dependency>

其中,freemarker的部份,是因為freemarker曾經改過maven的id,而struts 2與restlet相依的是不同位置,因此必須透過手動的方式,將其中一個排除。

尤於是搭配在現有的webapp當中,所以必需在web.xml中加入如下設定:

<servlet>
<servlet-name>restlet</servlet-name>
<servlet-class>com.noelios.restlet.ext.spring.SpringServerServlet</servlet-class>
<init-param>
<param-name>org.restlet.component</param-name>
<param-value>component</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>restlet</servlet-name>
<url-pattern>/resources/*</url-pattern>
</servlet-mapping>

其中,org.restlet.application與org.restlet.component分別指定spring設定檔中的application與component id,如此一來,就可以透過spring來為resource進行dependency injection了。

接下來,輪到主角applicationContext-rest.xml了,設定如下

<bean id="component" class="org.restlet.ext.spring.SpringComponent">
<property name="defaultTarget" ref="restRoute" />
</bean>
<bean id="restRoute" class="org.restlet.ext.spring.SpringRouter">
<property name="attachments">
<map>
<entry key="/employee/{empNo}">
<bean class="org.restlet.ext.spring.SpringFinder">
<lookup-method name="createResource" bean="employeeResource" />
</bean>
</entry>
</map>
</property>
</bean>

再加上employeeResource這個資源的定義,以及其Java實作,便能夠由webapp/resources/employee/{empNp}的位置,取得employee資訊了。