5、 Jackson @JsonView支持
可以使用@JsonView来分组渲染JSON数据,按需展示JSON数据。
5.1、模型
- public class User implements Serializable {
- public static interface OnlyIdView {}
- public static interface OnlyNameView {}
- public static interface AllView extends OnlyIdView, OnlyNameView {}
- @JsonView(OnlyIdView.class)
- private Long id;
- @JsonView(OnlyNameView.class)
- private String name;
- ……
- }
定义了三个视图:OnlyIdView、OnlyNameView和AllView。
5.2、控制器
- @RestController
- public class JacksonJsonViewController {
- @RequestMapping("/jackson1")
- @JsonView(User.OnlyIdView.class)
- public User test1() {
- return new User(1L, "zhangsan");
- }
- @RequestMapping("/jackson2")
- @JsonView(User.OnlyNameView.class)
- public User test2() {
- return new User(1L, "zhangsan");
- }
- @RequestMapping("/jackson3")
- @JsonView(User.AllView.class) //可以省略
- public User test3() {
- return new User(1L, "zhangsan");
- }
- }
使用@JsonView控制渲染哪些数据。
6、Jsonp支持
6.1、MappingJackson2JsonView提供的支持
- <bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView">
- <property name="jsonpParameterNames">
- <set>
- <value>jsonp</value>
- <value>callback</value>
- </set>
- </property>
- </bean>
然后访问如http://localhost:8080/json?callback=callback即可得到JSONP响应:callback({"user":{"id":1,"name":"zhangsan"}});。
6.2、对使用HttpMessageConverter的@ResponseBody的支持
- @Order(2)
- @ControllerAdvice(basePackages = "com.github")
- public class JsonpAdvice extends AbstractJsonpResponseBodyAdvice {
- public JsonpAdvice() {
- super("callback", "jsonp"); //指定jsonpParameterNames
- }
- }
访问http://localhost:8080/jackson1?callback=callback即可看到JSONP响应。
@ContollerAdvice的作用请参考《Spring3.2新注解@ControllerAdvice》,basePackages用于指定对哪些包里的Controller起作用。
6.3、ResponseBodyAdvice
我们之前实现的JsonpAdvice其继承自AbstractJsonpResponseBodyAdvice,而AbstractJsonpResponseBodyAdvice继承自ResponseBodyAdvice,其作用是在响应体写出之前做一些处理:
- @Order(1)
- @ControllerAdvice(basePackages = "com.github")
- public class MyResponseBodyAdvice implements ResponseBodyAdvice<Object> {
- @Override
- public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> converterType) {
- return methodParameter.getMethod().getReturnType().isAssignableFrom(User.class);
- }
- @Override
- public Object beforeBodyWrite(
- Object obj, MethodParameter methodParameter, MediaType mediaType,
- Class<? extends HttpMessageConverter<?>> converterType,
- ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
- User user = ((User)obj);
- user.setName("---" + user.getName() + "---");
- return user;
- }
- }
1、supports指定支持哪些类型的方法进行处理,此处是返回值为User的;2、我们得到User对象然后在名字前后拼上”---“ ;3、可以指定多个ResponseBodyAdvice,使用@Order指定顺序。访问http://localhost:8080/jackson2?callback=callback可以看到效果。
7、Gson HttpMessageConverter
7.1、Spring配置
- <mvc:annotation-driven>
- <mvc:message-converters>
- <bean class="org.springframework.http.converter.json.GsonHttpMessageConverter"/>
- </mvc:message-converters>
- </mvc:annotation-driven>
使用方式和Jackson Json类似。本文使用的是<gson.version>2.2.4</gson.version>版本。