1.概述
由于业务需要,一个接口可能既需要返回json,又需要返回xml。在SpringMVC中这很容易实现。
2.实例
首先对我们需要返回的数据进行处理,加上@XmlRootElement注解,这样才会转换为xml。
@XmlRootElement
public class ReponseResult {
//region 属性
public List<User> getUser() {
return user;
}
public void setUser(List<User> user) {
this.user = user;
}
private List<User> user;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
private String message;
public boolean isSuccess() {
return success;
}
public void setSuccess(boolean success) {
this.success = success;
}
private boolean success;
//endregion
public ReponseResult() {
}
public ReponseResult(List<User> _data, boolean _success, String _message) {
this.user = _data;
this.success = _success;
this.message = _message;
}
}
然后Controller中按照正常的方式写就ok了
@Controller
@RequestMapping("/test")
public class Test {
@ResponseBody
@RequestMapping(value = "/test1.do")
public ReponseResult test() {
ReponseResult reponseResult = new ReponseResult();
reponseResult.setSuccess(true);
reponseResult.setMessage("通用,成功");
List<User> list = new LinkedList<User>();
User m1 = new User();
User m2 = new User();
m1.setId("1");
m1.setName("test1");
m2.setId("2");
m2.setName("test2");
list.add(m1);
list.add(m2);
reponseResult.setUser(list);
return reponseResult;
}
}
3.测试
使用Postman根据进行测试,需要注意的是,如果想要返回指定的数据格式,需要设置header中的Accept属性。如果需要返回json,就设置application/json,如果需要返回XML,可以设置为application/xml.
4.produces and consumes
Spring MVC官方文档在介绍Request Mapping的部分,对两个参数设置做了介绍,一个是produces,一个是consumes
从官方文档介绍可知,设置consumes可以根据请求缩小请求映射Content-Type,设置produces可以您可以根据Accept请求标头和控制器方法生成的内容类型列表缩小请求映射。如果都不设置,默认是兼容所有的媒体类型。但是有一点需要注意的是请求header要设置Accept属性值,要不然,不会根据content-type返回对应的数据格式。自己刚开始的时候就因为不了解这个属性设置,结果试了好久都没成功。
6.the usage of produces and consumes
code:
@Controller
@RequestMapping("/test")
public class Test {
@ResponseBody
@RequestMapping(value = "/test1.do", produces = {"application/xml; charset=UTF-8","application/json; charset=UTF-8"},
consumes = {"application/json; charset=UTF-8","application/xml; charset=UTF-8"})
public ReponseResult test() {
ReponseResult reponseResult = new ReponseResult();
reponseResult.setSuccess(true);
reponseResult.setMessage("通用,成功");
List<User> list = new LinkedList<User>();
User m1 = new User();
User m2 = new User();
m1.setId("1");
m1.setName("test1");
m2.setId("2");
m2.setName("test2");
list.add(m1);
list.add(m2);
reponseResult.setUser(list);
return reponseResult;
}
}
produces和consumes支持字符串数组,在此,我设置了只接受json和xml两种媒体类型。
如果不设置Accept,即使content-type设置了json,返回的数据也是xml,这个返回的数据和produces中的顺序有关。