Welcome everyone

Spring MVC ResponseBody 补基础

java 汪明鑫 947浏览 0评论

害,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 补基础

喜欢 (4)

说点什么

您将是第一位评论人!

提醒
avatar
wpDiscuz