[英]Spring 3.0 + REST web service + json + xml
我现在已经尝试了很多事情,并在很多地方查找了此问题。
我正在尝试使用Spring MVC 3.0进行Rest Web服务调用,以JSON和XML的形式获取数据。 据我所知,当类路径中存在杰克逊核心和映射器jar时,Spring会自动将响应转换为jSon。 这将在项目中按预期工作。
我正在努力的是生成xml响应。 我不确定该怎么做。 我尝试了各种方法来设置生成xml响应的方法。 根据我的理解,jdk 6及更高版本具有JAXB实现。 因此,当我用XML注释对POJO进行注释以生成XML时,它应该给我一个XML响应。 但是由于某种原因,它一直给我JSON响应。 有任何想法吗? 以下是我的POJO,它具有XMLRootElement jaxb批注。
package my.dto;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "mydto")
public class MyDTO {
String name;
Long quantity;
String type;
public String getName() {
return name;
}
@XmlElement
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
@XmlElement
public void setType(String type) {
this.type = type;
}
public Long getQuantity() {
return quantity;
}
@XmlElement
public void setQuantity(Long quantity) {
this.quantity = quantity;
}
public MyDTO(String name, Long quantity) {
this.name = name;
this.quantity = quantity;
}
public MyDTO() {
super();
}
}
**My Controller:**
package my.package;
import java.util.ArrayList;
import java.util.List;
import my.dto.MyDTO;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Controller
@RequestMapping("/spring")
public class MyController {
@RequestMapping(value="{b}", method = RequestMethod.GET)
@Produces("application/xml")
public @ResponseBody List<MyDTO> getMyList(@PathVariable String b) {
MyDTO m1 = new MyDTO("My 1", Long.valueOf(100));
MyDTO m2 = new MyDTO("My 2", Long.valueOf(200));
List<MyDTO> list = new ArrayList<MyDTO>();
list.add(m1);
list.add(m2);
return list;
}
}
一:
是的 ,您需要@XML
批注,但是它们必须位于在setter上定义的getter中 ,这是错误的。
第二
您正在返回一个集合,对于XML来说有点不同,您需要创建以下内容
@XmlRootElement(name="list")
public class JaxbMyDTOList {
private List<MyDTO> list;
public JaxbMyDTOList(){}
public JaxbMyDTOList(List<MyDTO> list){
this.list=list;
}
@XmlElement(name="item")
public List<MyDTO> getList(){
return list;
}
}
三:
更改自:
@RequestMapping(value="{b}", method = RequestMethod.GET)
@Produces("application/xml")
public @ResponseBody List<MyDTO> getMyList(@PathVariable String b) {
至
@RequestMapping(value="{b}",
method = RequestMethod.GET,
produces=MediaType.APPLICATION_XML_VALUE)
public @ResponseBody JaxbMyDTOList getMyList(@PathVariable String b) {
注意:
@Produces("application/xml")
已删除,并由produces=MediaType.APPLICATION_XML_VALUE)
代替 List<MyDTO>
替换为JaxbMyDTOList
四:
我建议您创建其他@RequestMapping
方法,一个用于JSON,另一个用于处理XML。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.