1 概述 ............................................................................................................................................................. 1
2 开发参考 .................................................................................................................................................... 2 2.1 依赖 ................................................................................................................................................... 2 2.1.1 Maven 项目依赖 ................................................................................................................................. 2 2.1.2 JAR 包依赖 ............................................................................................................................................ 2 2.2 配置 ................................................................................................................................................... 2 2.2.1 参数说明 ................................................................................................................................................. 2 2.2.2 web.xml 配置 ........................................................................................................................................ 3 2.2.3 参数配置文件 ...................................................................................................................................... 4 2.3 注解 ................................................................................................................................................... 5 2.3.1 JAX-RS 注解 ........................................................................................................................................ 5 2.3.2 扩展注解 ................................................................................................................................................. 6
3 开发示例 .................................................................................................................................................... 7 3.1 创建 RestFul 服务类 .................................................................................................................. 7 3.2 创建参数配置文件 restconfig.properties ............................................................................ 9 3.3 配置 web.xml ................................................................................................................................. 9 3.4 访问测试 ........................................................................................................................................10
1 概述
REST组件是在开源Resteasy框架基础上扩展出的一个RESTFul Web Services框架。
它是基于 JAX-RS 规范的一个完整实现,可以很方便的构建 RESTFul Web Services。
组件针对于多对象传参支持能力不足做出扩展。支持参数从 JSON 提交大对象中选择
子对象,接口在定义上可以更加灵活,支持多对象参数(如接口参数为多个 JAVA BEAN 等
场景) ,支持 SDO 对象、CriteraType 等特殊对象的序列化、反序列化。
2
2 开发参考
2.1 依赖
2.1.1 Maven 项目依赖
com.primeton.components.restresteasy-jaxrs3.0.0com.primeton.components.restcom.primeton.components.rest3.0.0com.primeton.components.restjaxrs-api3.0.0com.primeton.components.restresteasy-jackson-provider3.0.0
2.1.2 JAR 包依赖
rest-3.0.0.zip 中所有的 jar 包
2.2 配置
2.2.1 参数说明
参数 默认值 描述
resteasy.servlet.mapping.prefix 无 如果对应的 servlet-mapping 的 url-pattern 不是
3
/*,该属性用来定义默认的前缀。
resteasy.scan false 是否自动扫描 WEB-INF/lib 下的所有 jar 包和
WEB-INF/classes 目录下的所有@Provider 注
解或者 JAX-RS 注解(@Path, @GET, @POST
等等)的类并且注册
resteasy.scan.providers false 是否自动扫描 WEB-INF/lib 下的所有 jar 包和
WEB-INF/classes 目录下的所有@Provider 注
解的类并且注册
resteasy.scan.resources false 是否自动扫描 WEB-INF/lib 下的所有 jar 包和
WEB-INF/classes 目录下的所有 JAX-RS 注解
(@Path, @GET, @POST 等等)的类并且注册
resteasy.providers 无 逗号分隔的所有@Provider 注解类全名
resteasy.resources 无 逗号分隔的 JAX-RS 标准注解的类全名。
javax.ws.rs.Application 无 自定义启动类Application。用来自定义需要加载
的资源。
2.2.2 web.xml 配置
rest.config.locations
classpath:config/restconfig.properties,
classpath*:config/restconfig.properties,
file:C:\Primeton\Platform\eos\restconfig.properties,
web-inf:restconfig/restconfig.properties
4
resteasy.servlet.mapping.prefix
/rest/services
myresteasy
com.primeton.components.rest.extend.CustomHttpServletDispatcher
myresteasy
/rest/services/*
说明:
1.需要servlet、servlet-mapping配置,servlet的类为
com.primeton.components.rest.extend.CustomHttpServletDispatcher
2.上下文参数“rest.config.locations”:用来配置参数配置文件(properties文件,文
件说明见2.2.3)的路径,支持多个配置文件,多个配置文件通过“,”分隔。
支持四种路径配置方式:
classpath 只会找到符合路径的第一个文件
classpath* 会找出所有符合路径的文件进行加载
file 文件系统文件
web-inf WEB-INF目录下文件
2.2.3 参数配置文件
1.配置文件必须为properties文件,否则不会解析
5
2.文件内容如:
resteasy.resources=com.primeton.rest.UserController
resteasy.injector.factory=com.primeton.components.rest.extend.JSONInjectorFactoryImpl
3.resteasy.resources参数支持多个配置,即使多个文件中都有该属性,也不会覆盖。
同一个properties文件中,多个值,需要通过“,”分隔。
2.3 注解
2.3.1 JAX-RS 注解
注解名 说明
@Path @Path 注解的值是一个相对的 URI 路径,这个路径指定了该 Java 类的
位置,例如/helloworld。在这个 URI 中可以包含变量,例如可以获取用
户的姓名然后作为参数传入 URI 中:/helloworld/{username}。
@GET @GET 注解是请求方法指示符,这个指示符注解的 Java 方法会处理
HTTPGET 请求。资源的行为由资源回应的 HTTP 方法决定。
@POST @POST 注解是请求方法指示符,这个指示符注解的 Java 方法会处理
HTTPPOST 请求。资源的行为由资源回应的 HTTP 方法决定。
@PUT @PUT 注解是请求方法指示符,这个指示符注解的 Java 方法会处理
HTTPPUT 请求。资源的行为由资源回应的 HTTP 方法决定。
@DELETE @DELETE 注解是请求方法指示符,这个指示符注解的 Java 方法会处
理 HTTPDELETE 请求。资源的行为由资源回应的 HTTP 方法决定。
@HEAD @HEAD 注解是请求方法指示符,这个指示符注解的 Java 方法会处理
HTTPHEAD 请求。资源的行为由资源回应的 HTTP 方法决定。
@PathParam @PathParam 注解是可以抽取并用在资源类中的一类参数。URIpath 参
数是从请求的 URI 中抽取的,而且参数的名称和@Path 注解中定义的
变量名对应。
@QueryParam @QueryParam 注解是可以抽取并在资源类中使用的一类参数。Query
参数是从请求 URI 的查询参数中抽取的。
@Consumes @Consumes注解是用来指定资源能够接受的客户发送的MIME媒体类
6
型。
@Produces @Produces 注解用来指定资源能够生成并发送给客户端的 MIME 媒体
类型,例如“text/plain”.
@Provider @Provider 注解用在任何对 JAX-RS 运行时(如 MessageBodyReader
和 MessageBodyWriter)有意义的事物上。对 HTTP 请求,
MessageBodyReader 用来将 HTTP 请求实体段映射为方法参数。在响
应的时候,返回的值使用 MessageBodyWriter 来映射成 HTTP 响应实
体段。如果应用程序需要提供其他的元数据,如 HTTP 头或不同的状态
代码,方法可以返回一个打包了实体的 Response,该 Response 可以
使用 Response.ResponseBuilder 创建。
2.3.2 扩展注解
注解 说明
@JSONParam 用来从 JSON 对象中选择自己想要的属性。如 POST 提交的 JSON
为
{
user1:{userId:’sysadmin’,username:’sysadmin’},
user2:{userId:’admin’,username:’admin’}
}
接口上想分别获取 user1 和 user2 两个属性,那么接口参数就可以定
义为
(@JSONParam(“user1”) User user1, @JSONParam(“user2”) User
user2)
7
3 开发示例
3.1 创建 RestFul 服务类
package com.primeton.rest;
import java.util.HashMap;
import java.util.Map;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import com.primeton.components.rest.annotation.JSONParam;
@Path("/book")
publicclass BookController {
/**
* 获取书名
* @param bookId
* @return
*/
@GET
@Path("/getBookName/{bookId}")
public String getBookName(@PathParam("bookId") String bookId){
return"HelloWorld";}
/**
8
* 保存操作
* POST的json格式如
* {
* book1:{bookId:'1',bookName:'book1'},
* book2:{bookId:'2',bookName:'book2'}
* }
* @param book
* @param book2
*/
@POST
@Path("/saveBooks")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Map getBook(@JSONParam("book1") Book
book1,@JSONParam("book2") Book book2){
//do save books
Map result = new HashMap();
result.put("result", "success");
result.put("book1", book1);
result.put("book2", book2);
return result;
}
/**
* 获取书详细信息
* POST提交的json格式如:
* {
* bookId:'1'
* }
9
* @Produces值为返回值可以为java bean,Map,List,Object[] 等各种类型。
* @param bookId
* @return
*/
@POST
@Path("/getBookObject")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Book getBookObject(@JSONParam("bookId") String bookId){
Book book = new Book();
book.setBookId(bookId);
book.setBookName("HelloWorld");
return book;
3.2 创建参数配置文件 restconfig.properties
resteasy.resources=com.primeton.rest.BookController
resteasy.injector.factory=com.primeton.components.rest.extend.JSONInjectorFactoryImpl
resteasy.servlet.mapping.prefix=/rest/services
3.3 配置 web.xml
rest.config.locations
classpath: config/restconfig.properties
restServlet
10
com.primeton.components.rest.extend.CustomHttpServletDispatcher
restServlet
/rest/services/*
3.4 访问测试
1.获取书名
启动服务后直接在浏览器中访问:
http://localhost:8080/rest_project/rest/services/book/getBookName/1
看到返回值“HelloWorld”证明访问成功。
2.保存数据
在测试 html 页面中通过 ajax 发请求进行测试,ajax 代码如下 $.ajax({ url:'http://localhost:8080/rest_project/rest/services/book/saveBooks', type:'POST', data:JSON.stringify({ book1:{bookId:'1',bookName:'book1'}, book2:{bookId:'2',bookName:'book2'}, }), contentType:'application/json', dataType:'json', success:function(ret){ alert('result:'+ret.result+" ; book1: "+ret.book1.bookName+" ; book2: "+ret.book2.bookName); }, error:function(ret){ alert("error"); }
11
});
看到页面 alert 出“result:success ;book1:book1; book2:book2”说明调用成功。
3.查询数据
在 html 测试页面中通过 ajax 发请求进行测试,ajax 代码如下 $.ajax({ url:'http://localhost:8080/rest_project/rest/services/book/getBookObject', type:'POST', data:JSON.stringify({ bookId:'1' }), contentType:'application/json', dataType:'json', success:function(book){ alert("bookId: "+book.bookId+" ; bookName: "+book.bookName); }, error:function(ret){ alert("error"); } });
看到页面 alert 出“bookId:1; bookName:HelloWorld”说明调用成功。