Wink与Spring集成的配置
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中将上述文件配置到restfulservlet的初始化参数中。如下
<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配置项,这样也能方便保证资源的单例。