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

JAXB使用ArrayList时XML结构无效

黄靖
2023-03-14

我在使用JAXB和对象列表时遇到问题。JAXB用于从spring 4中开发的REST api中整理/取消整理XML。类结构没有太多xml结构,而我使用的是ArrayList

我有Java业务对象模型如下:
客户端:

@XmlRootElement(name="client")
public class Client {
@XmlElement
public Integer age = Integer.valueOf(0);

 public Client() {
    super();
 }
}

Offer(根元素):

@XmlRootElement
@XmlSeeAlso(Client.class)
public class Offer {
@XmlElement
public ArrayList<Client> clients = new ArrayList<Client>();
public Boolean decission = Boolean.FALSE;

 public Offer() {
    super();
 }
}  

和反封送器:

public static Offern unmarshalXMLOffer(String httpMessage) throws Exception{
    logger.debug("unmarshal: receved data to unmarshal:  " + httpMessage);
    JAXBContext jaxbContext = JAXBContext.newInstance(Offer.class, Client.class);
    Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
    StringReader reader = new StringReader(httpMessage);
    Offer ca = (Offer)jaxbUnmarshaller.unmarshal(reader);
    return ca;
}

问题:
当我发送:

<Offer>
  <clients>
    <client>
        <age>21</age>
    </client>
  </clients>
  <decission>false</decission>
</Offer>

我得到:offer.client.age=0
但如果我将以下内容发送到解组器:

<Offer>
  <clients>
        <age>21</age>
  </clients>
  <decission>false</decission>
</Offer>

我得到:offer.client.age=21-正确值。

根据我所掌握的知识和一些JAXB经验,我只做了几件事:

>

  • 我尝试使用批注XmlSeeAllow
  • 为客户端列表创建了自定义包装类

    @XmlRootElement@XmlAccessorType(XmlAccessStype.Field)@XmlSeeAllow(Client.class)公共类ClientsXMLWrapper{@XmlElement(name=“clients”)私有列表客户端;

    public ClientsXMLWrapper(){
    
    }
    
    public ClientsXMLWrapper(List<Client> clientsList){
        clients = clientsList;
    }
    
    public List<Client> getClients() {
        return clients;
    }
    public void setClients(List<Client> clients) {
        this.clients = clients;
    }   
    

    }

    我进行了不同的JAXB初始化:

    1. jaxbContext jaxbContext=jaxbContext.newInstance(offer.class,client.class,clientsXMLWrapper.class);
    2. jaxbContext jaxbContext=jaxbContext.newInstance(offer.class,client.class);
    3. jaxbContext jaxbContext=jaxbContext.newInstance(offer.class,ClientsXMLWrapper.class);

    到目前为止没有任何帮助。你能帮我解决那个问题吗?科赫.

  • 共有1个答案

    能向晨
    2023-03-14

    尝试:

    @XmlElementWrapper(name="clients")
    @XmlElement(name="client")
    public ArrayList<Client> clients = new ArrayList<Client>();
    
     类似资料:
    • 我有以下结构:

    • 我试图使用JAXB将ArrayList转换为xml... ...但它不工作,我得到这个错误: 2012年8月27日10:43:58组织。阿帕奇。卡塔琳娜。果心StandardWrapperValve:Servlet。路径为[/Spring3 LDAP WebService]的上下文中servlet[spring]的service()引发异常[请求处理失败;嵌套异常为javax.xml.bind.J

    • 我正在考虑创建XML文件的Java生成器,然后由另一个Java程序加载这些文件(我不能更改那里的代码)。很明显的答案是JAXB,但是我偶然发现了一个问题。 所有三个XML都将是生成器的有效输出。我已经为fistElement、secondElement等创建了Java类(有很多),但我想不出如何将它们全部添加到一个HeadTag元素下。 我有很多元素,超过500个,所以把它们作为一个字段放在课堂上

    • 我已经生成java类使用从一个xsd,其中根元素是类型的。 jaxb生成的根元素是 当我尝试解组与该xsd对应的xml并强制转换JaxbElement时,它会引发一个强制转换异常: 片段:

    • 主要内容:一个 XML 文档实例,XML 文档形成一种树结构,实例:,XML 文档实例XML 文档形成了一种树结构,它从"根部"开始,然后扩展到"枝叶"。 一个 XML 文档实例 XML 文档使用简单的具有自我描述性的语法: <?xml version="1.0" encoding="UTF-8"?> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me th