Почему мой jaxb2marshaller не отменяет маршалинг того, что раньше делал? - PullRequest
0 голосов
/ 16 мая 2018

Я борюсь с конфигурацией jaxb2marshaller для работы с классами, сгенерированными из файла wsdl.

Мой jaxb2marshaller

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

Я готовлю структуру классов и передаю их через 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 будет нулевым.Нет трассировки стека или чего-либо еще.

Мои сгенерированные классы выглядят так:

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 (например, имя класса) вместо Persons (который указан в @XmlElementRef).Тем не менее, я не знаю, почему это происходит

1 Ответ

0 голосов
/ 17 мая 2018

Итак, в конце концов оказалось, что моя фабрика сгенерированных объектов имеет 2 метода, которые возвращают один и тот же JaxbObject и принимают объект ArrayOfPerson и очень похожее имя, но в @XmlElementDecl было указано другое имя, и, конечно, я использовал неправильный для генерацииXML, поэтому я не мог потреблять его позже.: /

...