Сбой десериализации XML для xmlmapper - PullRequest
0 голосов
/ 03 апреля 2019

Я пытаюсь десериализовать XML с помощью XMLmapper, и он завершается неудачно со следующей ошибкой. POJO генерируются с использованием инструмента jaxb XJC при разрешении зависимостей. Та же десериализация проходит без проблем, если я использую jaxb Unmarhsalling. У меня нет никакого контроля над XSDS. Может кто-нибудь помочь? Я попытался добавить привязки, чтобы сгенерировать отдельные имена пакетов, это не помогло. Я думаю, что я не могу переименовать свойство, так как xml может потерпеть неудачу, поскольку я получаю XML из апстрима. Есть предложения?

Несколько полей, представляющих свойство "PaymentPlanID": om.datatype.defn.v1.PaymentDetailDataType # paymentPlanID против om.datatype.defn.v1.PaymentDetailDataType # paymentPlanIDV2

Код ниже работает

 jaxbContext = JAXBContext.newInstance(EventsRequestType.class);
 Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
 InputStream is = new ByteArrayInputStream(input.getBytes());
 EventsRequestType outputRequest = ((JAXBElement<EventsRequestType>) jaxbUnmarshaller.unmarshal(is)).getValue();

Это не работает

jacksonXmlModule jacksonXmlModule = new JacksonXmlModule();
jacksonXmlModule.setDefaultUseWrapper(false);
MAPPER = new XmlMapper(jacksonXmlModule);
MAPPER.registerModule(new JaxbAnnotationModule());
EventsRequestType outputRequest = MAPPER.readValue(input, EventsRequestType.class);

Файл в Pojo, сгенерированный JAXB

 @XmlElement(name = "PaymentPlanID", namespace = "urn:payment:messages:v1")
    protected String paymentPlanID;
    @XmlElement(name = "PaymentPlanID", namespace = "urn:payment:processor:messages:v2")
    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
    @XmlSchemaType(name = "token")
    @Size(min = 1)
    protected String paymentPlanIDV2;

Экстракт XSD

<xs:complexType name="PaymentDetailDataType">
        <xs:complexContent>
            <xs:extension base="data:BaseDataType">
                <xs:sequence>
                    <xs:choice>
                        <xs:element ref="payment:PaymentPlanID">
                        </xs:element>
                        <xs:element ref="payment_v2:PaymentPlanID">
                            <xs:annotation>
                                <xs:appinfo>
                                    <jaxb:property name="PaymentPlanIDV2"/>
                                </xs:appinfo>
                            </xs:annotation>
                        </xs:element>                                       
                </xs:choice>
                </xs:sequence>
                <xs:attribute name="id" type="xs:ID" use="required">
                    </xs:annotation>
                </xs:attribute>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
...