害,Spring MVC @ResponseBody
不是多清楚,写点demo、看点文章回顾一哈
package pers.wmx.springbootfreemarkerdemo.entity;
/**
* @author: wangmingxin03
* @date: 2020-05-28
*/
public class User {
private Long userId;
private String userName;
private Integer age;
private Integer sex;
private String description;
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
//不想展示age
// public Integer getAge() {
// return age;
// }
public void setAge(Integer age) {
this.age = age;
}
public Integer getSex() {
return sex;
}
public void setSex(Integer sex) {
this.sex = sex;
}
//response body 根据get方法解析
public String getPersonalDescription() {
return getUserName() + "个人介绍 : " + description;
}
public void setDescription(String description) {
this.description = description;
}
}
@RequestMapping("/response/test")
@ResponseBody
public User testResponse1(){
User user = new User();
user.setUserName("xinye");
user.setDescription("shuaiqi");
return user;
}
返回字段是以get方法为准的,而不是以字段为准
get方法可以对类的字段做一些处理再返回
没有get方法的字段不下发返回
有get方法的字段没有set值,下发展示null
我用的Spring Boot建的demo
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.1.3.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-json</artifactId>
<version>2.1.3.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<version>2.1.3.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.14.Final</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.1.5.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.5.RELEASE</version>
<scope>compile</scope>
</dependency>
</dependencies>
我们看到有上面这些依赖
点这个依赖看一下 spring-webmvc
我们看到里面有jackson依赖,json数据的请求返回处理是jackson做的
public interface HttpMessageConverter<T> {
// 当前转换器是否能将HTTP报文转换为对象类型
boolean canRead(Class<?> clazz, MediaType mediaType);
// 当前转换器是否能将对象类型转换为HTTP报文
boolean canWrite(Class<?> clazz, MediaType mediaType);
// 转换器能支持的HTTP媒体类型
List<MediaType> getSupportedMediaTypes();
// 转换HTTP报文为特定类型
T read(Class<? extends T> clazz, HttpInputMessage inputMessage)
throws IOException, HttpMessageNotReadableException;
// 将特定类型对象转换为HTTP报文
void write(T t, MediaType contentType, HttpOutputMessage outputMessage)
throws IOException, HttpMessageNotWritableException;
}
HttpMessageConverter接口定义了5个方法,用于将HTTP请求报文转换为java对象,以及将java对象转换为HTTP响应报文。
消息转换器有很多,它们的共同接口是HttpMessageConverter
对应到SpringMVC的Controller方法,read方法即是读取HTTP请求转换为参数对象,write方法即是将返回值对象转换为HTTP响应报文。
SpringMVC定义了两个接口来操作这两个过程:参数解析器HandlerMethodArgumentResolver
和返回值处理器HandlerMethodReturnValueHandler
。
// 参数解析器接口
public interface HandlerMethodArgumentResolver {
// 解析器是否支持方法参数
boolean supportsParameter(MethodParameter parameter);
// 解析HTTP报文中对应的方法参数
Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception;
}
// 返回值处理器接口
public interface HandlerMethodReturnValueHandler {
// 处理器是否支持返回值类型
boolean supportsReturnType(MethodParameter returnType);
// 将返回值解析为HTTP响应报文
void handleReturnValue(Object returnValue, MethodParameter returnType,
ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception;
}
Spring帮我们注册了很多转换器,所以需要循环它们,来确定使用哪一个来做消息转换。
如果是JSON数据格式的,会选择MappingJackson2HttpMessageConverter
来处理
转载请注明:汪明鑫的个人博客 » Spring MVC ResponseBody 补基础
说点什么
您将是第一位评论人!