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

来源:互联网 发布:alias是什么软件 编辑:程序博客网 时间:2024/05/22 12:57

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

一、核心依赖jar包:

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

<properties>  <jackson.version>2.7.3</jackson.version></properties><dependency>  <groupId>com.fasterxml.jackson.core</groupId>  <artifactId>jackson-core</artifactId>  <version>${jackson.version}</version></dependency><dependency>  <groupId>com.fasterxml.jackson.core</groupId>  <artifactId>jackson-databind</artifactId>  <version>${jackson.version}</version></dependency><dependency>  <groupId>com.fasterxml.jackson.core</groupId>  <artifactId>jackson-annotations</artifactId>  <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>

大功告成!!!!

阅读全文
0 0