概述
最近项目想要重构api调用,由原来传统soap rpc web service 重构为restful web service.
在众多的rest架构中,Jersey,Resteasy,Restlet,Apache CXF, 考虑到集成能力,稳定性,安全性,易用性,维护以及配置,选择Resteasy.Resteasy是JBoss的一个开源项目,是ax-rs规范的一个完整实现,其开发易上手.
demo
开始搭建一个helloworld.
准备:jdk8
pom.xml
<!--resteasy -->
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<version>3.1.3.Final</version>
</dependency>
不使用application
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();
}
}
打印:helloworld
基于application控制
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.