1、概念
当返回值为JSON时,根据Handler方法的返回值分为以下两种情形:
- 当返回值为字符串类型时,它可以直接是JSON字符串。
- 当返回值为实体对象时,通过配置将实体对象转换为字符串。
2、使用
根据返回值的类型,它的实现方式有三种。
- 当返回值为JSON字符串时,添加@ResponseBody注解,设置produces属性
- 当返回值为实体对象时,添加@JsonView注解。
- 当返回值为实体对象时,配置相关配置项。
2.1 json字符串
当返回值为JSON字符串时,它的使用步骤如下:
- 第一步,在handler方法上添加@Responsebody注解,或者在Controller类上添加@RestController注解
- 第二步,在@XXMapping方法上设置produces属性的值为Application json相关的值即可。或者在Controller类上添加@XXMapping注解,并设置produces的值。
2.2 jsonView
当返回值为实体对象时,它的使用步骤如下:
- 第一步,创建返回的实体对象,现在通常情况下都是ResponseEntity<T>,组成部分有三个code,message,data。
- 第二步,在实体对象的属性上添加@JsonView注解。
- 第三步,在handler方法上添加@JsonView,@ResponseBody注解。
2.3 配置
当返回值为实体对象时,它的使用步骤如下:
- 第一步,配置响应内容类型,调用configureContentNegotiation。
- 第二步,配置HttpMessageConverter。
- 第三步,验证,返回任意的实体对象。
3、示例
在实际项目中经常使用json字符串,示例省略。
3.1 JsonView示例
1、第一步,创建ResponseEntity<T>对象。在属性上添加@JsonView注解
@Getter @Setter public class ResponseEntity<T extends Bean> { public interface ResponseData {}; // 返回码 @JsonView(ResponseData.class) private Integer code; // 返回信息 @JsonView(ResponseData.class) private String message; // 返回实体对象 @JsonView(ResponseData.class) private T data; }
2、第二步,在Handler方法上添加@JsonView注解
@GetMapping("/jsonView") @ResponseBody @JsonView(ResponseData.class) public ResponseEntity<User> getUser(@ModelAttribute User user) { ResponseEntity<User> responseData = new ResponseEntity<User>(); responseData.setCode(200); responseData.setMessage("some message"); responseData.setData(user); return responseData; }
3、第三步,在User实体对象上,需要返回的属性上添加@JsonView注解
@Getter @Setter public class User extends Bean{ // 姓名 @JsonView(ResponseData.class) private String name; // 年龄 @JsonView(ResponseData.class) private int age; }
4、第四步,验证,访问jsonView,结果如下:
{"code":200,"message":"somemessage","data":{"name":"Jack","age":10}}
3.2 配置
1、第一步,配置内容响应类型,当请求中携带.json后缀时,响应内容就会设置为Application_json
@Override public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { // 是否支持url中的后缀做为判断依据,false时会禁用 configurer.favorPathExtension(true) // 请求Url参数的名称,或者是请求头中的参数名称 .parameterName("mediatype") // 是否忽略请求头信息,true会忽略,此时相当于禁用根据请求头信息判断内容类型 .ignoreAcceptHeader(false) .useJaf(false) // 设置默认的响应类型,此时设置为Application_json .defaultContentType(MediaType.APPLICATION_JSON_UTF8) // 建立参数值或者是后缀值与响应类型MediaType之间的关系,例如请求url后缀为xx.json,此时根据json,响应类型为Application_JSON .mediaType("json", MediaType.APPLICATION_JSON) // xml表示Application_xml .mediaType("xml", MediaType.APPLICATION_XML); }
2、第二步,配置HttpMessageConverter
/** * * 配置messageConverter */ @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { // 创建ObjectMapperBuilder对象 Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder().indentOutput(true) .dateFormat(new SimpleDateFormat("yyyy-MM-dd")); // 将对象转换为JSON converters.add(new MappingJackson2HttpMessageConverter(builder.build())); }
3、第三步,验证。访问jsonView.json,结果如下:
{ "code" : 200, "message" : "some message", "data" : { "name" : "Jack", "age" : 10 } }
这种方式个人感觉最优。