为什么我的 jaxb2marshaller 不解组它之前编组的内容?

Why my jaxb2marshaller does not unmarshal what it marshalled before?

我正在努力使用 jaxb2marshaller 配置来处理从 wsdl 文件生成的 classes。

我的 jaxb2marshaller

 public Jaxb2Marshaller marshaller() {
    final Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
    marshaller.setContextPaths("org.otheruri", "org.tempuri");
    return marshaller;
  }

我准备了一个 classes 的结构并将它们传递给 marshaller.marshal 以获得 xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:ValidateResponse xmlns="http://otheruri.org" xmlns:ns2="http://tempuri.org/">
<ns2:ValidateResult>
<ArrayOfPerson>
<Person><NawNumber>personNAW</NawNumber></Person>
</ArrayOfPerson>
</ns2:ValidateResult>
</ns2:ValidateResponse>

但是当我使用这个 xml 和 运行 marshaller.unmarshall 时 ValidateResult.arrayOfPerson 是空的。没有堆栈跟踪或任何东西。

我生成的 classes 看起来像这样

package org.tempuri

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "validateResult"
})
@XmlRootElement(name = "ValidateResponse")

    public class ValidateResponse {

        @XmlElementRef(name = "ValidateResult", namespace = "http://tempuri.org/", type = JAXBElement.class, required = false)
        protected JAXBElement<org.otheruri.ValidateResponse> validateResult;

        public JAXBElement<org.otheruri.ValidateResponse> getValidateResult() {
            return validateResult;
        }

        public void setValidateResult(JAXBElement<org.otheruri.ValidateResponse> value) {
            this.validateResult = value;
        }

}

package org.otheruri

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "ValidateResponse", propOrder = {
    "persons",
    "userLoggedIn"
})
public class ValidateResponse {

    @XmlElementRef(name = "Persons", namespace = "http://otheruri.org", type = JAXBElement.class, required = false)
    protected JAXBElement<ArrayOfPerson> persons;
    @XmlElementRef(name = "UserLoggedIn", namespace = "http://otheruri.org", type = JAXBElement.class, required = false)
    protected JAXBElement<ValidateCredentialsResponse> userLoggedIn;


    public JAXBElement<ArrayOfPerson> getPersons() {
        return persons;
    }

    public void setPersons(JAXBElement<ArrayOfPerson> value) {
        this.persons = value;
    }

    public JAXBElement<ValidateCredentialsResponse> getUserLoggedIn() {
        return userLoggedIn;
    }

    public void setUserLoggedIn(JAXBElement<ValidateCredentialsResponse> value) {
        this.userLoggedIn = value;
    }

}

编辑

经过时间和大量调试后,我知道出了什么问题。由于未知原因,创建的 xml 具有 ArrayOfPerson 节点(如 class 名称)而不是 Persons(在 @XmlElementRef 中指定)。我仍然不知道为什么会这样

所以最后我生成的对象工厂似乎有 2 个方法,它们返回相同的 JaxbObject 并接受 ArrayOfPerson 对象和非常相似的名称,但在 @XmlElementDecl 中指定了不同的名称,当然我使用了错误的方法生成 xml,所以我以后无法使用它。 :/