1. 引言
Apache Wink 是一个 Restful 开发 JAXB-RS 规范的实现框架,和以前用过的 CXF 比较多, restful 还是比较小巧的(小巧也是应该,毕竟 wink 只是 restful 的框架,并不支持 SOAP )。 Wink 的部署也很简单,大概有三种方式吧。
第一种是通过注册 wink 提供的 SimpleWinkApplication 来注册 restful 的资源,资源直接在配置文件中声明。配置文件内容举例:
文件: rest-resources.properties
# Resources com.example.FooResource com.example.BarResource
在系统的 web.xml 中将上述文件配置到 restful servlet 的初始化参数中。如下
<servlet> <servlet-name>restSdkService</servlet-name> <servlet-class> org.apache.wink.server.internal.servlet.RestServlet </servlet-class> <init-param> <param-name>applicationConfigLocation</param-name> <param-value>/WEB-INF/rest-resources.properties </param-value> </init-param> </servlet>
第二种是通过 Application 注册资源,通过实现 javax.ws.rs.core.Application 接口来配置和注册资源。
以上两种我们只是简单介绍,配置均比较直观,参考 wink 的官方文档均能比较容易配置实现。本文主要介绍下第三种方式——与 spring 集成。关于与 spring 集成,官方文档也有介绍,但是在具体某些地方说的不够到位,对于刚接触 wink 的使用者在实施过程中可能就会遇到那些不是问题的问题。下面就详细介绍下集成的配置过程。而对于 restful 资源的开发不在本文介绍之内。
2. Web.xml 的配置
首先在系统的 web.xml 配置文件中我们需要加入 wink 的 servlet 配置,这也是 wink 实现 restful 服务的入口, Wink 通过该 RestServlet 处理接收到的 HTTP 请求。
配置如下:
<servlet> <servlet-name>restService</servlet-name> <servlet-class> org.apache.wink.server.internal.servlet.RestServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>restService</servlet-name> <url-pattern>/rest/*</url-pattern> </servlet-mapping>
因为我们是要和 spring 集成的,因为在 web.xml 中还要加入 spring 的支持。配置如下:
<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:META-INF/server/wink-core-context.xml classpath:applicationContext-*.xml </param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener>
这里有一点是需要注意的,就是参数值 classpath:META-INF/server/wink-core-context.xml ,这个文件是存在 wink 的 wink-spring-support-1.2.0-incubating.jar 中的,这个 jar 可以在下载的 apache-wink-1.2.0-incubating.zip 的 ext 目录中找到。如果要修改其中的默认配置,可以将该文件拷出来另存到其他目录并进行修改,当然这样的话此处的配置也需要重新指定到新路径。 classpath:applicationContext-*.xml 这个配置项是指的 spring 的配置文件。
至此, web.xml 文件的配置工作就完成了。
3. Spring 的配置
<bean id="fooResource" class="com.harvey.stuido.ws.rest.resources.FooResource"/> <bean class="org.apache.wink.spring.Registrar"> <property name="classes"> <set value-type="java.lang.Class"> </set> </property> <property name="instances"> <set> <ref bean="fooResource" /> </set> </property> </bean>
其中的 fooResource 是我们要发布的 restful 的资源(关于 restful 资源的开发略)。其中的 classes 配置项中的 class 集合我们留空,这个配置与前面提到的第二种方式的 Application 的 getClasses 功能类似,因为我们是要想利用 spring 来管理各个 resource ,所以我们只配置 instances 配置项,这样也能方便保证资源的单例。