最近项目想要重构api调用,由原来传统soap rpc web service 重构为restful web service.
在众多的rest架构中,Jersey,Resteasy,Restlet,Apache CXF, 考虑到集成能力,稳定性,安全性,易用性,维护以及配置,选择Resteasy.Resteasy是JBoss的一个开源项目,是ax-rs规范的一个完整实现,其开发易上手.
开始搭建一个helloworld.
准备:jdk8
pom.xml
<!--resteasy --> <dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>resteasy-jaxrs</artifactId> <version>3.1.3.Final</version> </dependency>web.xml
<!-- Auto scan REST service 扫描注册rest服务--> <context-param> <param-name>resteasy.scan</param-name> <param-value>true</param-value> </context-param> <context-param> <param-name>resteasy.resources</param-name> <param-value>stu.resteasy.TestResource</param-value> </context-param> <!-- this need same with resteasy ser vlet url-pattern 访问目录,要与servle-mapping对应,可不设--> <context-param> <param-name>resteasy.servlet.mapping.prefix</param-name> <param-value>/rest</param-value> </context-param> <!--listener 监听器--> <listener> <listener-class> org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap </listener-class> </listener> <!--servlet--> <servlet> <servlet-name>resteasy-servlet</servlet-name> <servlet-class> org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher </servlet-class> </servlet> <servlet-mapping> <servlet-name>resteasy-servlet</servlet-name> <url-pattern>/rest/*</url-pattern> </servlet-mapping>此段注释掉也能成功
<context-param> <param-name>resteasy.scan</param-name> <param-value>true</param-value> </context-param>官方注释:Automatically scan WEB-INF/lib jars and WEB-INF/classes directory for both @Provider and JAX-RS resource classes (@Path, @GET, @POST etc..) and register them
注释掉或者设置为false,还是会成功,后来才知道这个resteasy.scan在3.0版本后已经过时了,现在resource可以自扫描.推荐Use a servlet 3.0 container and the ResteasyServletInitializer.
配置资源
package stu.resteasy; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.core.Response; @Path("/testResource") public class TestResource { @GET @Path("/{param}") public Response printMessage(@PathParam("param") String msg) { String result = "Restful example : " + msg; return Response.status(200).entity(result).build(); } } 访问:localhost:8080/ rest/helloworld打印:helloworld
web.xml
<!-- this need same with resteasy servlet url-pattern 访问目录,要与servle-mapping对应,可不设--> <context-param> <param-name>resteasy.servlet.mapping.prefix</param-name> <param-value>/rest</param-value> </context-param> <!--servlet--> <servlet> <servlet-name>resteasy-servlet</servlet-name> <servlet-class> org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher </servlet-class> <init-param> <param-name>javax.ws.rs.Application</param-name> <param-value>stu.resteasy.TestApplication</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>resteasy-servlet</servlet-name> <url-pattern>/rest/*</url-pattern> </servlet-mapping>以上可配置多个
application
package stu.resteasy; import java.util.HashSet; import java.util.Set; import javax.ws.rs.ApplicationPath; import javax.ws.rs.core.Application; @ApplicationPath("/rest") public class TestApplication extends Application { private static Set<Class<?>> classes = new HashSet<Class<?>>(); @Override public Set<Class<?>> getClasses() { //注册服务,可注册多个 classes.add(TestResource.class); classes.add(TestResourceA.class); return classes; } }此处的@ApplicationPath主要设置resource的资源跟路径
http://localhost:8080/rest/testResource/helloworld 打印:helloworld
注意:
假如使用ResteasyServletInitializer(容器启动)容器启动空的web.xml,不需要配置任何配置,依赖注解@ApplicationPath
(ResteasyServletInitializer初始化将每个application生成servlet交于org.jboss.resteasy.plugins.server.servlet.HttpServlet30Dispatcher)
ResteasyServletInitializer只支持servlet3.0以上,所以使用的servlet容器必须是3.0以上,比如jetty8.0,tomcat7.