当前位置: 首页 > 知识库问答 >
问题:

Spring 4 REST程序使用JAXB返回XML格式的列表

赵修诚
2023-03-14

我正在尝试使用Spring4实现REST服务。

REST 方法将以 XML 格式返回客户对象的列表。该应用程序是注释驱动的。

对于XML,我使用了JAXB注释。按照我的理解,Spring在找到Jaxb注释时会使用“JAXB 2 rootelementtpmessageconverter”开箱即用。

客户:

@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(根据Spring4)

以 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:根据请求“accept”标头,由该请求标识的资源只能生成具有不可接受特征的响应。

注意:

当我试图用XML返回一个客户对象时,它像预期的那样工作。但是,我无法返回XML格式的客户对象列表。

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

需要帮忙。谢谢。

共有2个答案

梁磊
2023-03-14

406不可接受请求标识的资源仅能够根据请求中发送的接受标头生成具有不可接受的内容特征的响应实体。

后端服务响应的是,它返回的响应类型未提供/或者在请求的接受类型 HTTP 标头中有所不同。

找出服务器返回的响应内容类型。在您的请求HTTP Accept头值中提供此内容类型。http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html HTTP状态代码

其他观察结果我认为您应该使用参数化类型的List。

private List<String> favBookList; 
public List<String> getFavBookList() {
   return favBookList;
}
public void setFavBookList(List<String> favBookList) {
   this.favBookList = favBookList;
}
姬和歌
2023-03-14

我能够生成客户列表的 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;
}

响应 :

<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 根元素应该是实体名称的复数形式,即在这种情况下的客户。

有什么想法或建议吗?

 类似资料:
  • 编辑:感谢Preetam Kumar,这个问题已经解决,但错误现在在其他地方。当我再次尝试解组我的xml文件时,我收到这个错误,告诉我找不到元素: 然而,我给了xml文件到模式的正确路径,但是它似乎没有使用它...我不明白。 注意:我知道模式和xml标记在下面的示例中不完全匹配,我已经在我的文件中纠正了它。 最近,我不得不使用JAXB java库将一些XML文件解析为java对象。 我制作了一个X

  • 问题内容: 我有具有以下结构的Java类(类名并不表示任何东西,我只是在组成它们)。 整理测试实例时,JAXB生成的XML输出是我遇到的问题。XML输出将始终如下所示: 如您所见,某些元素没有正确缩进(即,最深的元素,计数和句点)。这是为什么?我创建JAXB上下文的方式有问题吗?还是JAXB可以递归缩进多少元素有最大限制?我该如何解决?请注意,我也已将JAXB_FORMATTED_OUTPUT设置

  • 我试图在Spring Boot应用程序中对YQL进行REST调用。即使我设置了'format=json',调用也会返回'application/javascript',这将导致以下消息: 组织。springframework。网状物客户RestClientException:无法提取响应:未找到响应类型[class com.dilteam.research.YqlQueryResult]和内容类型

  • 问题内容: 我正在尝试使用JAXB将A序列化为XML。我是Java的新手(来自C#),所以对此任务感到困惑。 我已经看到以下代码: 像这样被调用:,但是是错误的(我已经知道)。 Java专家可以告诉我如何调用此代码吗?提出一个更简单的实现(当然还有一个调用示例)也是最受欢迎的。 谢谢。 问题答案: 您将需要创建一个包装器类以保留: 然后,您可以执行以下操作: 这将产生以下输出: 注意事项 是线程安

  • 本文向大家介绍Springmvc如何返回xml及json格式数据,包括了Springmvc如何返回xml及json格式数据的使用技巧和注意事项,需要的朋友参考一下 问:@ResponseBody注解怎么指定返回xml 还是json 答:@RequestMapping 的produces 属性指定 produces = "application/xml" 或者 produces = "applica

  • 问题内容: 如何使用Jersey / JAX-RS框架以XML / JSON文档形式返回a并不是很明显。它已经支持s了,但是当涉及到s时,就没有了。即使将嵌入到包装器类中,XML模式中也没有类型。 关于如何在Jersey中将地图编组为XML / JSON文档的任何实用建议? 问题答案: 我知道它的回复很晚,但是我希望有一天它能对某人有所帮助:)我应用的最简单,最快的修复方法是 输出:{“ 1”:“