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
}
}
这种方式个人感觉最优。