Springmvc 4.1新特性-jsonp支持

来源:互联网 发布:js中获取元素的方法 编辑:程序博客网 时间:2024/05/18 13:43

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。

 

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控制渲染哪些数据。 

3、使用AbstractJsonpResponseBodyAdvice 实现支持jsonp 

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/json?callback=callback即可得到JSONP响应:callback({"user":{"id":1,"name":"zhangsan"}});。 

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

 

4、使用ResponseBodyAdvice也可以对响应体做一些处理,如下自定义MyResponseBodyAdvice 

      我们之前实现的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. }  

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

0 0
原创粉丝点击