JAXB解组-找不到具有默认根元素的描述符...

时间:2019-02-15 16:09:52

标签: java xml namespaces jaxb unmarshalling

在将api xml响应解组到我创建的POJO时遇到问题。

我确定JAXB上下文知道我的课程,因为我能够正确地编组它。

POJO

package com.bnh.element.misc.Requests;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "selectionResponse")
@XmlAccessorType(XmlAccessType.FIELD)
public class SelectionResponse {
    @XmlElement
    boolean _hasErrors;
    @XmlElement
    int selectionIndex;
    @XmlElement
    String type;

}

试图解组:

Object response = JAXB_CONTEXT.createUnmarshaller()
    .unmarshal( new StringReader(xml) );

引发异常

  

[Exception [EclipseLink-25008](Eclipse Persistence Services-2.6.4.v20160829-44060b6):org.eclipse.persistence.exceptions.XMLMarshalException       异常描述:在项目中找不到带有默认根元素{http://tripos.vantiv.com/2014/09/TriPos.Api} selectionResponse的描述符]           在org.eclipse.persistence.jaxb.JAXBUnmarshaller.handleXMLMarshalException(JAXBUnmarshaller.java:1110)

API的实际响应

<selectionResponse
  xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
  xmlns="http://tripos.vantiv.com/2014/09/TriPos.Api">
  <_errors />
  <_hasErrors>false</_hasErrors>
  <_links />
  <_logs
    xmlns:d2p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays" i:type="Logs" />
    <_type>selectionResponse</_type>
    <_warnings />
    <selectionIndex>0</selectionIndex>
  </selectionResponse>

将对象编组后生成的字符串:

<selectionResponse
    xmlns:ns0="http://tripos.vantiv.com/2014/09/TriPos.Api">
    <_hasErrors>false</_hasErrors>
    <selectionIndex>0</selectionIndex>
</selectionResponse>

任何帮助将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:0)

您的错误说明很多:

  

异常描述:在项目中找不到带有默认根元素{http://tripos.vantiv.com/2014/09/TriPos.Api} selectionResponse的描述符]

您的xml中的默认xmlns是:

  xmlns="http://tripos.vantiv.com/2014/09/TriPos.Api">

它不能被“迷惑”,因此将名称空间添加到您的根元素声明中,例如:

@XmlRootElement(name = "selectionResponse",
    namespace="http://tripos.vantiv.com/2014/09/TriPos.Api")
@XmlAccessorType(XmlAccessType.FIELD)
public static class SelectionResponse {
...