Spring4.1新特性——jsonp

5、 Jackson @JsonView支持 

可以使用@JsonView来分组渲染JSON数据,按需展示JSON数据。

5.1、模型

Java代码   收藏代码
  1. public class User implements Serializable {  
  2.     public static interface OnlyIdView {}  
  3.     public static interface OnlyNameView {}  
  4.     public static interface AllView extends OnlyIdView, OnlyNameView {}  
  5.   
  6.     @JsonView(OnlyIdView.class)  
  7.     private Long id;  
  8.   
  9.     @JsonView(OnlyNameView.class)  
  10.     private String name;    
  11.     ……  
  12. }  

定义了三个视图:OnlyIdView、OnlyNameView和AllView。

 

5.2、控制器

Java代码   收藏代码
  1. @RestController  
  2. public class JacksonJsonViewController {  
  3.   
  4.     @RequestMapping("/jackson1")  
  5.     @JsonView(User.OnlyIdView.class)  
  6.     public User test1() {  
  7.         return new User(1L, "zhangsan");  
  8.     }  
  9.   
  10.     @RequestMapping("/jackson2")  
  11.     @JsonView(User.OnlyNameView.class)  
  12.     public User test2() {  
  13.         return new User(1L, "zhangsan");  
  14.     }  
  15.   
  16.     @RequestMapping("/jackson3")  
  17.     @JsonView(User.AllView.class//可以省略  
  18.     public User test3() {  
  19.         return new User(1L, "zhangsan");  
  20.     }  
  21. }  

使用@JsonView控制渲染哪些数据。

 

6、Jsonp支持  

6.1、MappingJackson2JsonView提供的支持 

Java代码   收藏代码
  1. <bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView">  
  2.     <property name="jsonpParameterNames">  
  3.         <set>  
  4.             <value>jsonp</value>  
  5.             <value>callback</value>  
  6.         </set>  
  7.    </property>  
  8. </bean>  

然后访问如http://localhost:8080/json?callback=callback即可得到JSONP响应:callback({"user":{"id":1,"name":"zhangsan"}});。

 

6.2、对使用HttpMessageConverter的@ResponseBody的支持 

Java代码   收藏代码
  1. @Order(2)  
  2. @ControllerAdvice(basePackages = "com.github")  
  3. public class JsonpAdvice extends AbstractJsonpResponseBodyAdvice {  
  4.     public JsonpAdvice() {  
  5.         super("callback""jsonp"); //指定jsonpParameterNames  
  6.     }  
  7. }  

访问http://localhost:8080/jackson1?callback=callback即可看到JSONP响应。 

 

@ContollerAdvice的作用请参考《Spring3.2新注解@ControllerAdvice》,basePackages用于指定对哪些包里的Controller起作用。

 

6.3、ResponseBodyAdvice

我们之前实现的JsonpAdvice其继承自AbstractJsonpResponseBodyAdvice,而AbstractJsonpResponseBodyAdvice继承自ResponseBodyAdvice,其作用是在响应体写出之前做一些处理: 

Java代码   收藏代码
  1. @Order(1)  
  2. @ControllerAdvice(basePackages = "com.github")  
  3. public class MyResponseBodyAdvice implements ResponseBodyAdvice<Object> {  
  4.   
  5.     @Override  
  6.     public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> converterType) {  
  7.         return methodParameter.getMethod().getReturnType().isAssignableFrom(User.class);  
  8.     }  
  9.   
  10.     @Override  
  11.     public Object beforeBodyWrite(  
  12.             Object obj, MethodParameter methodParameter, MediaType mediaType,  
  13.             Class<? extends HttpMessageConverter<?>> converterType,  
  14.             ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {  
  15.   
  16.         User user = ((User)obj);  
  17.         user.setName("---" + user.getName() + "---");  
  18.         return user;  
  19.     }  
  20. }  

1、supports指定支持哪些类型的方法进行处理,此处是返回值为User的;2、我们得到User对象然后在名字前后拼上”---“ ;3、可以指定多个ResponseBodyAdvice,使用@Order指定顺序。访问http://localhost:8080/jackson2?callback=callback可以看到效果。

 

7、Gson HttpMessageConverter

7.1、Spring配置 

Java代码   收藏代码
  1. <mvc:annotation-driven>  
  2.     <mvc:message-converters>  
  3.         <bean class="org.springframework.http.converter.json.GsonHttpMessageConverter"/>  
  4.     </mvc:message-converters>  
  5. </mvc:annotation-driven>  

使用方式和Jackson Json类似。本文使用的是<gson.version>2.2.4</gson.version>版本。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值