java - Spring 4 REST 程序使用 JAXB 返回 XML 列表

标签 java xml spring rest jaxb

我正在尝试使用 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)

以 XML 格式返回客户列表的 REST 方法:

@RequestMapping(value="/customer-list.xml",produces="application/xml")
public  List<Customer> getCustomerListInXML(){
    List<Customer> customerList = new ArrayList<Customer>();
    Customer customerObj1 = new Customer();
    customerObj1.setId(1);
    customerObj1.setName("Vijay");
    ArrayList<String> favBookList1 = new ArrayList<String>();
    favBookList1.add("Book1");
    favBookList1.add("Book2");
    customerObj1.setFavBookList(favBookList1);
    customerList.add(customerObj1);
    Customer customerObj2 = new Customer();
    customerObj2.setId(2);
    customerObj2.setName("Rajesh");
    ArrayList<String> favBookList2 = new ArrayList<String>();
    favBookList2.add("Book3");
    favBookList2.add("Book4");
    customerObj2.setFavBookList(favBookList2);
    customerList.add(customerObj2);
    return customerList;
}

点击网址时的预期结果:

 <customers>
  <customer id="1">
   <booklist>
    <book xsi:type="xs:string">Book1</book>
    <book xsi:type="xs:string">Book2</book>
   </booklist>
   <name>Vijay</name>
  </customer>
  <customer id="2">
   <booklist>
    <book xsi:type="xs:string">Book3</book>
    <book xsi:type="xs:string">Book4</book>
   </booklist>
   <name>Rajesh</name>
  </customer>
 </customers>

我得到了什么:

HTTP 406: 此请求标识的资源只能生成具有根据请求“接受” header Not Acceptable 特征的响应。

注意:

当我尝试以 XML 格式返回 Customer 对象时,它按预期工作。 但是,我无法返回 XML 中的客户对象列表。

该应用程序是使用 java 7 开发的,它在 Tomcat 7 上运行。

需要帮助。谢谢。

最佳答案

我能够生成客户列表的 XML。

首先创建一个通用包装类(其背后的意图是使用这个通用类来传递任何类的对象列表)。

通用包装类:

@XmlRootElement
@XmlSeeAlso({Customer.class})
public class EntityList<T> {

 private List<T> listOfEntityObjects;

    public EntityList() {
        listOfEntityObjects = new ArrayList<T>();
    }

    public EntityList(List<T> listOfEntityObjects) {
        this.listOfEntityObjects = listOfEntityObjects;
    }

    @XmlAnyElement
    public List<T> getItems() {
        return listOfEntityObjects;
    }

修改后的 REST 方法:

@RequestMapping(value="/customer-list.xml",produces="application/xml")
public  EntityList<Customer> getCustomerListInXML(){
    List<Customer> customerList = new ArrayList<Customer>();
    Customer customerObj1 = new Customer();
    customerObj1.setId(1);
    customerObj1.setName("Vijay");
    ArrayList<String> favBookList1 = new ArrayList<String>();
    favBookList1.add("Book1");
    favBookList1.add("Book2");
    customerObj1.setFavBookList(favBookList1);
    customerList.add(customerObj1);
    Customer customerObj2 = new Customer();
    customerObj2.setId(2);
    customerObj2.setName("Rajesh");
    ArrayList<String> favBookList2 = new ArrayList<String>();
    favBookList2.add("Book3");
    favBookList2.add("Book4");
    customerObj2.setFavBookList(favBookList2);
    customerList.add(customerObj2);
    EntityList<Customer> listOfCustomers =   
    new EntityList<Customer>  (customerList);

    return listOfCustomers;
}

XML 响应:

<entityList>
 <customer id="1">
  <booklist>
   <book xsi:type="xs:string">Book1</book>
   <book xsi:type="xs:string">Book2</book>
  </booklist>
  <name>Vijay</name>
 </customer>
 <customer id="2">
  <booklist>
   <book xsi:type="xs:string">Book3</book>
   <book xsi:type="xs:string">Book4</book>
  </booklist>
  <name>Rajesh</name>
 </customer>
</entityList>

注意:

生成的XML的根元素是entityList(取自包装类的名字)

但是,我希望 XML 根元素应该是实体名称的复数形式,即 customers 在这种情况下。

有什么想法或建议吗?

关于java - Spring 4 REST 程序使用 JAXB 返回 XML 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28293973/

相关文章:

spring - SpelParseException : After parsing a valid expression, 表达式中还有更多数据: 'lcurly({)'

java - 可以通过Spring配置和启动嵌入式Tomcat吗?对 Jetty 好吗?

java - 最简单/最简单的浏览器游戏引擎是什么?

java - Android - 连接到蓝牙模块

java - 使用 Redis Sentinel 的 Spring Boot 缓存始终连接到主节点

xml - XSLT 删除所有属性的前导和尾随空格

java - JSch 0.1.54 dh-group14-sha1 算法协商失败

XML Xpath - 选择其中元素 = 多个值

c# - 在.Net中使用Linq解析没有根元素的xml元素

java - Spring MVC Controller 中如何根据特定条件显示不同的JSP页面?