Spring 4 REST程序使用JAXB以XML格式返回List
我正在尝试使用Spring 4实现REST服务。
REST方法将返回XML中的客户对象列表。 该应用程序是注释驱动的。
对于XML,我使用了JAXB注释。 根据我的理解,Spring会在找到JAXB注释时使用“Jaxb2RootElementHttpMessageConverter”开箱即用。
客户POJO:
@XmlRootElement(name = "customer") public class Customer { private int id; private String name; private List favBookList; @XmlAttribute public int getId() { return id; } public void setId(int id) { this.id = id; } @XmlElement public String getName() { return name; } public void setName(String name) { this.name = name; } @XmlElementWrapper(name = "booklist") @XmlElement(name="book") public List getFavBookList() { return favBookList; } public void setFavBookList(List favBookList) { this.favBookList = favBookList; } }
我已将REST服务类注释为@RestController(根据Spring 4)
REST方法以XML格式返回客户列表:
@RequestMapping(value="/customer-list.xml",produces="application/xml") public List getCustomerListInXML(){ List customerList = new ArrayList(); Customer customerObj1 = new Customer(); customerObj1.setId(1); customerObj1.setName("Vijay"); ArrayList favBookList1 = new ArrayList(); favBookList1.add("Book1"); favBookList1.add("Book2"); customerObj1.setFavBookList(favBookList1); customerList.add(customerObj1); Customer customerObj2 = new Customer(); customerObj2.setId(2); customerObj2.setName("Rajesh"); ArrayList favBookList2 = new ArrayList(); favBookList2.add("Book3"); favBookList2.add("Book4"); customerObj2.setFavBookList(favBookList2); customerList.add(customerObj2); return customerList; }
当我点击URL时,我预期的结果:
Book1 Book2 Vijay Book3 Book4 Rajesh
我得到了什么:
HTTP 406:由该请求标识的资源仅能够根据请求“接受”报头生成具有不可接受的特性的响应。
注意 :
当我尝试以XML格式返回Customer对象时,它按预期工作。 但是,我无法返回XML中的Customer对象列表。
该应用程序是使用java 7开发的,它运行在Tomcat 7上。
需要帮助。 谢谢。
我能够生成客户列表的XML。
首先创建一个通用的包装类(这背后的意图是使用这个generics类来传递任何类的对象列表)。
通用包装类:
@XmlRootElement @XmlSeeAlso({Customer.class}) public class EntityList { private List listOfEntityObjects; public EntityList() { listOfEntityObjects = new ArrayList (); } public EntityList(List listOfEntityObjects) { this.listOfEntityObjects = listOfEntityObjects; } @XmlAnyElement public List getItems() { return listOfEntityObjects; }
修改后的REST方法:
@RequestMapping(value="/customer-list.xml",produces="application/xml") public EntityList getCustomerListInXML(){ List customerList = new ArrayList (); Customer customerObj1 = new Customer(); customerObj1.setId(1); customerObj1.setName("Vijay"); ArrayList favBookList1 = new ArrayList (); favBookList1.add("Book1"); favBookList1.add("Book2"); customerObj1.setFavBookList(favBookList1); customerList.add(customerObj1); Customer customerObj2 = new Customer(); customerObj2.setId(2); customerObj2.setName("Rajesh"); ArrayList favBookList2 = new ArrayList (); favBookList2.add("Book3"); favBookList2.add("Book4"); customerObj2.setFavBookList(favBookList2); customerList.add(customerObj2); EntityList listOfCustomers = new EntityList (customerList); return listOfCustomers; }
XML响应:
Book1 Book2 Vijay Book3 Book4 Rajesh
注意 :
生成的XML的根元素是entityList(取自包装类的名称)
但是,我希望XML根元素应该是实体名称的复数,即本例中的客户 。
有什么想法或建议吗?
406不可接受请求标识的资源仅能够根据请求中发送的接受标头生成具有不可接受的内容特征的响应实体。
您的后端服务正在响应未提供返回的响应类型/或者请求中的Accept-Type HTTP header
中的不同。
找出服务器返回的响应内容类型。 在您的请求HTTP Accept标头值中提供此内容类型。 http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html HTTP状态代码
其他观察我认为你应该使用List的参数化类型。
private List favBookList; public List getFavBookList() { return favBookList; } public void setFavBookList(List favBookList) { this.favBookList = favBookList; }