您的位置:首页 > 编程语言 > Java开发

SpringMVC中使用@RequestBody,@ResponseBody注解实现Java对象和XML/JSON数据自动转换(下)

2016-05-25 16:09 966 查看
原文:http://blog.csdn.net/fw0124/article/details/48312317

上一篇分析了Spring中是如何通过使用@ResponseBody注解,实现自动转换Java对象为XML,JSON数据到Reponse中。

接下来看看如果request中包含了XML或者JSON数据,反过来,如何来通过@RequestBody注解来自动转换为Java对象。

配合@RequestBody注解,以及HTTP Request Header中的Content-Type属性,HTTP Request Body中包含的[b]XML或者JSON数据可以自动被转换成对应的Java对象。[/b]

1)首先在controller中添加handlermapping。

[java] view
plain copy

/** 

 * 根据request header中的Content-Type自动转换XML/JSON->EmployeeX对象 

 * 根据request header中的Accept自动选择返回XML or JSON 

 */  

@RequestMapping(method=RequestMethod.POST)  

@ResponseBody  

public EmployeeServiceResponse createEmployee(@RequestBody EmployeeX employee) {  

    logger.debug("creating a employee:[{}]", employee);  

    return new EmployeeServiceResponse(0, "");  

}  

[java] view
plain copy

package learning.webapp.model;  

  

import javax.xml.bind.annotation.XmlRootElement;  

  

@XmlRootElement  

public class EmployeeServiceResponse {  

    private Integer errcode;  

    private String errmsg;  

  

    public EmployeeServiceResponse() {  

    }  

      

    public EmployeeServiceResponse(Integer errcode, String errmsg) {  

        this.errcode = errcode;  

        this.errmsg = errmsg;  

    }  

          

    public Integer getErrcode() {  

        return errcode;  

    }  

  

    public void setErrcode(Integer errcode) {  

        this.errcode = errcode;  

    }  

  

    public String getErrmsg() {  

        return errmsg;  

    }  

  

    public void setErrmsg(String errmsg) {  

        this.errmsg = errmsg;  

    }  

}  

2)运行以下两个测试函数

[java] view
plain copy

<span style="white-space:pre">    </span>@Test  

    public void testJsonRequestResponse() throws IOException, URISyntaxException {  

        String url = "http://localhost:8080/employees";  

        HttpHeaders requestHeaders = new HttpHeaders();  

        requestHeaders.set("Accept", "application/json");  

        requestHeaders.set("Content-Type", "application/json");  

          

        String jsonStr = "{\"name\":\"Jack\",\"salary\":16000}";  

  

        RestTemplate restTemplate = new RestTemplate();  

        HttpEntity<String> httpEntity = new HttpEntity<String>(jsonStr, requestHeaders);  

        String jsonData = restTemplate.postForObject(url, httpEntity, String.class);  

  

        System.out.println(jsonData);  

    }  

      

    @Test  

    public void testXmlRequestResponse() throws IOException, URISyntaxException {  

        String url = "http://localhost:8080/employees";  

        HttpHeaders requestHeaders = new HttpHeaders();  

        requestHeaders.set("Accept", "application/xml");  

        requestHeaders.set("Content-Type", "application/xml");  

          

        String xmlStr = "<employeeX><name>Jack</name><salary>16000</salary></employeeX>";  

  

        RestTemplate restTemplate = new RestTemplate();  

        HttpEntity<String> httpEntity = new HttpEntity<String>(xmlStr, requestHeaders);  

        String xmlData = restTemplate.postForObject(url, httpEntity, String.class);  

  

        System.out.println(xmlData);  

    }  

3)我们甚至可以任意组合请求和应答中的XML/JSON。比如Request=XML,Response=JSON

[java] view
plain copy

@Test  

public void testXmlRequestJsonResponse() throws IOException, URISyntaxException {  

    String url = "http://localhost:8080/employees";  

    HttpHeaders requestHeaders = new HttpHeaders();  

    requestHeaders.set("Accept", "application/json");  

    requestHeaders.set("Content-Type", "application/xml");  

      

    String xmlStr = "<employeeX><name>Jack</name><salary>16000</salary></employeeX>";  

  

    RestTemplate restTemplate = new RestTemplate();  

    HttpEntity<String> httpEntity = new HttpEntity<String>(xmlStr, requestHeaders);  

    String jsonData = restTemplate.postForObject(url, httpEntity, String.class);  

  

    System.out.println(jsonData);  

}  

类似上一篇中的分析,最关键的处理在AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters()。它会根据request header中的Content-Type属性来选择合适的message converter.



---------------------

以下引用自参考资料1:

如果不想使用<mvc:annotation-driven/>中默认的RequestMappingHandlerAdapter的话,我们可以在重新定义这个bean,spring会覆盖掉默认的RequestMappingHandlerAdapter。

为何会覆盖,请参考博客:http://www.cnblogs.com/fangjian0423/p/spring-Ordered-interface.html
[code]<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
<bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
<bean class="org.springframework.http.converter.ResourceHttpMessageConverter"/>
</list>
</property>
</bean>


或者如果只想换messageConverters的话。
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.example.MyHttpMessageConverter"/>
<bean class="org.example.MyOtherHttpMessageConverter"/>
</mvc:message-converters>
</mvc:annotation-driven>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息