Restlet 2.0 与 Spring集成,并遵循JAX-RS标准,JSR311
2011-08-22 17:25
435 查看
先声明我只是给出一个work-around plan,还有些不尽如人意的地方(文章最后会指出)。
首先,给出web.xml 和spring cofng xml
web.xml
ApplicationContext-restlet.xml
SpringJaxObjectFactory
SprinJaxConfig
HelloWorldresource
RestDictionary
不足:
1. 解析path对应到具体Resource Class时,需要考虑到context的root path,如果在servlet request propogate的时候,修改URL也是个work around 方法,可以参考http://code.google.com/p/urlrewritefilter/
2. id为jaxBeanCollection的Spring Bean,继承于org.springframework.beans.factory.BeanFactoryAware,在spring配置里再嵌套个BeanFactory,似乎有些可以简化的地方。
附录:
pom.xml
首先,给出web.xml 和spring cofng xml
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <filter> <filter-name>EncodingFilter</filter-name> <filter-class>org.brianlabs.filter.EncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>EncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <servlet-name>restserver</servlet-name> <servlet-class>org.restlet.ext.spring.RestletFrameworkServlet</servlet-class> <load-on-startup>1</load-on-startup> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:/ApplicationContext-restlet.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>restserver</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> </web-app>
ApplicationContext-restlet.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd" > <bean id="root" class="org.restlet.ext.spring.SpringComponent"> <property name="defaultTarget" ref="restServer" /> </bean> <bean id="restServer" class="org.restlet.ext.jaxrs.JaxRsApplication"> <property name="objectFactory" ref="springJaxObjectFactory"/> <property name="applications" ref="springJaxConfig"/> </bean> <bean id="root.context" class="org.springframework.beans.factory.config.PropertyPathFactoryBean"/> <bean id="springJaxObjectFactory" class="org.brianlabs.restlet.spring.SpringJaxObjectFactory"> <constructor-arg ref="jaxBeanCollection" /> </bean> <bean id="springJaxConfig" class="org.brianlabs.restlet.spring.SpringJaxConfig"> <constructor-arg ref="jaxBeanCollection" /> </bean> <bean id="jaxBeanCollection" class="org.brianlabs.restlet.spring.JaxBeanCollection"> <property name="beanNames"> <list> <value>helloWorldResource</value> </list> </property> </bean> <bean id="helloWorldResource" class="org.brianlabs.restlet.resources.HelloWorldresource" scope="prototype" /> </beans>
SpringJaxObjectFactory
package org.brianlabs.restlet.spring; import org.restlet.ext.jaxrs.InstantiateException; import org.restlet.ext.jaxrs.ObjectFactory; /** * The spring-friendly class responsible for configuring the jax-rs object construction. * @author Brian Ling * */ public class SpringJaxObjectFactory implements ObjectFactory { /** The jax-bean collection that drives this component. **/ private JaxBeanCollection myBeanCollection; /** * Create the Spring Jax Object Factory. * @param beanCollection The jax-bean collection that will drive this component. */ public SpringJaxObjectFactory(final JaxBeanCollection beanCollection) { this.myBeanCollection = beanCollection; } @Override public <T> T getInstance(final Class<T> jaxRsClass) throws InstantiateException { T bean = myBeanCollection.getBean(jaxRsClass); return bean; } }
SprinJaxConfig
package org.brianlabs.restlet.spring; import java.util.Set; /** * The spring-friendly class responsible for configuring the jax-rs context. * @author Brian Ling * */ public class SpringJaxConfig extends javax.ws.rs.core.Application { /** The jax-bean collection that drives this component. **/ private JaxBeanCollection myBeanCollection; /** * Create the Spring Jax Config. * @param beanCollection The jax-bean collection that will drive this component. */ public SpringJaxConfig(final JaxBeanCollection beanCollection) { this.myBeanCollection = beanCollection; } @Override public Set<Class<?>> getClasses() { return myBeanCollection.getBeanTypes(); } }
HelloWorldresource
package org.brianlabs.restlet.resources; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import org.brianlabs.restlet.RestDictionary; @Path(RestDictionary.BASE_HELLO_WORLD_PATH) public class HelloWorldresource extends StandardResource { @GET @Produces("text/plain") public String getPlain() { return "This is an easy resource (as plain text)"; } }
RestDictionary
package org.brianlabs.restlet; public class RestDictionary { public final static String BASE_HELLO_WORLD_PATH="/restlet/hello"; public static final String JSON_OUTPUT = "application/json"; public static final String HTML_TEXT_OUTPUT = "text/html"; public static final String ID = "id"; }
不足:
1. 解析path对应到具体Resource Class时,需要考虑到context的root path,如果在servlet request propogate的时候,修改URL也是个work around 方法,可以参考http://code.google.com/p/urlrewritefilter/
2. id为jaxBeanCollection的Spring Bean,继承于org.springframework.beans.factory.BeanFactoryAware,在spring配置里再嵌套个BeanFactory,似乎有些可以简化的地方。
附录:
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.brianlabs</groupId> <artifactId>restlet</artifactId> <packaging>war</packaging> <version>0.0.1-SN 4000 APSHOT</version> <name>restlet J2EE 1.4 Webapp</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.4</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.restlet.jee</groupId> <artifactId>org.restlet.ext.spring</artifactId> <version>2.0.9</version> </dependency> <dependency> <groupId>org.restlet.jee</groupId> <artifactId>org.restlet</artifactId> <version>2.0.9</version> </dependency> <dependency> <groupId>org.restlet.jee</groupId> <artifactId>org.restlet.ext.jaxrs</artifactId> <version>2.0.9</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.15</version> <exclusions> <exclusion> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> </exclusion> <exclusion> <groupId>javax.jms</groupId> <artifactId>jms</artifactId> </exclusion> <exclusion> <groupId>com.sun.jdmk</groupId> <artifactId>jmxtools</artifactId> </exclusion> <exclusion> <groupId>com.sun.jmx</groupId> <artifactId>jmxri</artifactId> </exclusion> </exclusions> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.0.2</version> <configuration> <source>1.6</source> <target>1.6</target> </configuration> </plugin> </plugins> <finalName>restlet</finalName> </build> <repositories> <repository> <id>maven-restlet</id> <name>Public online Restlet repository</name> <url>http://maven.restlet.org</url> </repository> </repositories> </project>
相关文章推荐
- maven+springmvc错误 JAX-RS (REST Web Services) 2.0 can not be installed
- Spring 4 集成Apache CXF开发JAX-RS Web Service
- maven+springmvc错误 JAX-RS (REST Web Services) 2.0 can not be installed
- CXF 开发RESTful WebService服务(Spring+JPA服务端,JAXRS2.0+WebClient客户端)
- maven+springmvc错误 JAX-RS (REST Web Services) 2.0 can not be installed
- Spring Boot 集成 resteasy篇 — jax-rs常用注解介绍
- maven+springmvc错误 JAX-RS (REST Web Services) 2.0 can not be installed
- Spring Boot 集成 resteasy篇 — jax-rs初步介绍和spring boot集成
- CXF系列之JAX-RS:CXF与spring集成发布REST服务
- Spring2.0与Struts的集成
- JAVA :RESTLET开发实例(一)基于JAX-RS的REST服务
- Apache CXF实现Web Service(3)——Tomcat容器和不借助Spring的普通Servlet实现JAX-RS(RESTful) web service
- Jersey-Spring集成:java.lang.AbstractMethodError: javax.ws.rs.core.UriBuilder.uri(Ljava/lang/String;)..
- cxf jax-rs spring client
- JAX-RS(REST Web Services)2.0 requires Dynamic Web Module 3.1 or newer
- spring boot 集成quartz 2.0 实现前端动态配置(获取spring上下文)的两种方式,启动数据库中已开启定时任务
- JAX-RS 2.0 中 REST 的四种服务类型
- Spring 2.0 发布了 AOP变了且能集成最新AspectJ 5
- 集成ssh时,MyEclipse8.5无法添加spring 2.0 orm/dao/hibernate3 libraries
- 框架 day64 WebService(注解),CXF框架(jax-ws,Jax-rs,与spring整合)