后端——框架——视图层框架——spring_mvc——《官网》阅读笔记——第一章节20(核心对象,视图解析器,JSON)

1、概念

  当返回值为JSON时,根据Handler方法的返回值分为以下两种情形:

  1. 当返回值为字符串类型时,它可以直接是JSON字符串。
  2. 当返回值为实体对象时,通过配置将实体对象转换为字符串。

2、使用

  根据返回值的类型,它的实现方式有三种。

  1. 当返回值为JSON字符串时,添加@ResponseBody注解,设置produces属性
  2. 当返回值为实体对象时,添加@JsonView注解。
  3. 当返回值为实体对象时,配置相关配置项。

2.1    json字符串

  当返回值为JSON字符串时,它的使用步骤如下:

  1. 第一步,在handler方法上添加@Responsebody注解,或者在Controller类上添加@RestController注解
  2. 第二步,在@XXMapping方法上设置produces属性的值为Application json相关的值即可。或者在Controller类上添加@XXMapping注解,并设置produces的值。

2.2    jsonView

  当返回值为实体对象时,它的使用步骤如下:

  1. 第一步,创建返回的实体对象,现在通常情况下都是ResponseEntity<T>,组成部分有三个code,message,data。
  2. 第二步,在实体对象的属性上添加@JsonView注解。
  3. 第三步,在handler方法上添加@JsonView,@ResponseBody注解。

2.3     配置

  当返回值为实体对象时,它的使用步骤如下:

  1. 第一步,配置响应内容类型,调用configureContentNegotiation。
  2. 第二步,配置HttpMessageConverter。
  3. 第三步,验证,返回任意的实体对象。

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
  }
}

  这种方式个人感觉最优。

原文地址:https://www.cnblogs.com/rain144576/p/12903012.html