顯示具有 REST 標籤的文章。 顯示所有文章
顯示具有 REST 標籤的文章。 顯示所有文章

星期五, 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資訊了。

星期六, 9月 22, 2007

CXF REST transport notes


搞了一整天,總算試出CXF的REST介面可以運作的設定模式,雖然wrapped mode一直搞不定,不過,總算搞定unwrapped mode的設定方式。主要必需注意的事情是:


  • interface上一定要有@WebService annotation

  • 在需要傳遞的參數上必需要使用 @HttpResource 指定對應的uri pattern

  • 因為是unwrapped mode, 接受的參數都必需要用VTO (value transfer object)包起來,如同CXF 文件Java REST annotation中的範例一樣

  • CXF 會根據 URI template中的參數名稱{param}將參數對於到VTO中的property。



範例 (interface), spring 設定中的 serviceFactory必需設定unwrapped = false


@WebService(targetNamespace="http://employee.some.company.com")
public interface EmployeeService {
@Get
@HttpResource(location="/employees/{serial}")
@WebResult(name="Employee")
Employee getEmployee(GetEmployee getEmployee);
}