【原创文章,转载请注明原文章地址,谢谢!】
本节开始,进入Jersey的Provider介绍。本节介绍的是Jersey提供的最简单的两个Provider:MessageBodyWriter和MessageBodyReader。
每一个涉及到输入输出的框架都会存在输入输出转化的问题。比如接受到一个请求,应该以什么样的方式去处理请求?应该由谁来把请求里面的内容按照什么样的方式转化成应用需要的数据。一个资源方法返回一个对象,又应该以什么样的方式输出给客户端?
在SpringMVC中,是由HttpMessageConverter类来完成这个转化的,在Jersey中,就是依赖MessageBodyWriter和MessageBodyReader两个类型来完成的。
为什么要学习这两个相对来说比较内部的类型呢?
1,对于我们了解Jersey内部请求转化机制和响应输出机制有更深刻的理解;
2,对于我们选择合适的Entity Provider有合理的依据;
3,对于我们扩展自定义的Entity Provider提供可能;
那本节的流程为,我们先来完成自己的MessageBodyWriter和MessageBodyReader,然后理解MessageBodyReader/MessageBodyWriter的选择流程,最后来看看Jersey提供的内置的MessageBodyWriter/MessageBodyReader。
认识MessageBodyWriter/MessageBodyReader
简单理解,MessageBodyWriter作用就是把资源方法的响应按照某种方式输出给客户端;MessageBodyReader就是把请求资源方法的请求内容按照某种方式转化成资源方法的参数;
举个例子:
@Path("/emps/")
@GET
@Produces(MediaType.APPLICATION_JSON)
public Employee get(@QueryParam("no") Long no){
return new Employee(no);
}
那么,当我们在请求GET /emps?no=100的时候,就需要通过一个指定的MessageBodyReader来把请求中的no=100设置到Long no参数中。同理,当方法返回一个Employee对象,就需要一个指定的MessageBodyWriter把Employee对象使用某个json框架序列化为JSON字符串返回客户端。
自定义MessageBodyWriter/MessageBodyReader
需求:在Jersey中,默认使用Jackson(老外都喜欢用Jackson)来完成Request Json->Object和Object-> Json的转化。我们尝试来使用Fastjson实现该功能。但是为了简化开发难度,我们创建一个注解,例如FastJson,来标注哪些类使用Fastjson来完成序列化和反序列化。那么标注了FastJson的类才是我们的目标类型。
那么首先,创建一个FastJson注解:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface FastJson {
}
其次,修改pom.xml,增加Fastjson的依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>