实现SpringMVC中使用@Responsebody注解返回任意POJO对象转换成JSON

最近去实习,在第三天老大终于给个项目源码来学习学习了,很难得,然后在阅读源码过程中,发现了很多值得学习的东西,比如一些规范、面向对象设计、框架使用等。
以前以为SpringMVC中使用@Responsebody注解后,只能返回JSONObject,今天让我学到很多东西,原来只要是对象都能返回,只是我们需要把对象转换成JSON类型的字符串。

一、核心依赖jar包:

我这里使用的是maven,so附上maven依赖配置。

<properties>
  <jackson.version>2.7.3jackson.version>
properties>
<dependency>
  <groupId>com.fasterxml.jackson.coregroupId>
  <artifactId>jackson-coreartifactId>
  <version>${jackson.version}version>
dependency>

<dependency>
  <groupId>com.fasterxml.jackson.coregroupId>
  <artifactId>jackson-databindartifactId>
  <version>${jackson.version}version>
dependency>

<dependency>
  <groupId>com.fasterxml.jackson.coregroupId>
  <artifactId>jackson-annotationsartifactId>
  <version>${jackson.version}version>
dependency>

上述jar包核心作用是把java对象转换成json字符串。

二、自定义java对象

@JsonInclude(JsonInclude.Include.NON_NULL)//不包含有null值的字段,即字段值为null的转换为json字符串时会被省略
public class User{
    @JsonProperty("user_name")//设置该字段转换为json后的字段名
    private String name;
    private int age;
    public void setName(String name){
        this.name = name;
    }
    public String getName(){
        return name;
    }
    public void setAge(int age){
        this.age = age;
    }
    public int getAge(){
        return age;
    }
}

上面定义的这个user类,使用ObjectMapper.writeValueAsString(user)方法转换会返回一个json字符串,例如:{“user_name”:”xyh”,”age”:22}
ObjectMapper类在maven配置的依赖jar包中。
好了,看到这里估计很多人都会有点猜测是怎么做到返回任意对象转换成json写到响应体了。

三、自定义HttpMessageConverter继承MappingJackson2HttpMessageConverter

很多做过在SpringMVC的朋友应该都知道需要配置MessageConverter,我们这里由于是返回任意POJO对象,so我们需要继承MappingJackson2HttpMessageConverter重写writeInternal方法,例:

public class MyHttpMessageConverter implements MappingJackson2HttpMessageConverter{
@Override
    protected void writeInternal (Object object,
                                 HttpOutputMessage outputMessage) throws IOException,
            HttpMessageNotWritableException {
        // 使用 Jackson 的 ObjectMapper 将 Java 对象转换成 Json String
        ObjectMapper mapper = new ObjectMapper ();
        String json = mapper.writeValueAsString (object);
        outputMessage.getBody().write (json.getBytes ());
    }
};

object是我们mvc的controller返回的对象,
outputMessage对象的getBody ()方法可以获取到Response体的输出流对象。
还有就是,如果有需要的朋友,可以在在这里给json字符串加密,这样就能实现加密传输了,当然了,现在有https。
到这里还差最后一步,配置MVC注解驱动,配置上面我们自定义的转换器

<mvc:annotation-driven >
    <mvc:message-converter register-defaults="true">
        <bean class="com.xyh.converter.MyHttpMessageConverter"/>
    mvc:message-converter>
mvc:annotation-driven>

大功告成!!!!

你可能感兴趣的:(Java开发)