Unmarshall XML Строка в POJO на верблюде без XML Аннотации - PullRequest
0 голосов
/ 20 января 2020

В процессе изучения API Amazon Marketplace я пытаюсь разархивировать следующую строку XML в класс POJO с похожим именем:

<?xml version="1.0" encoding="UTF-8"?>
<ListOrdersResponse xmlns="https://mws.amazonservices.com/Orders/2013-09-01">
   <ListOrdersResult>
        <NextToken>String</NextToken>
        <CreatedBefore>1969-07-21T02:56:03Z</CreatedBefore>
        <LastUpdatedBefore>1969-07-21T02:56:03Z</LastUpdatedBefore>
        <Orders>
            <Order>
                <AmazonOrderId>String</AmazonOrderId>
                <SellerOrderId>String</SellerOrderId>
                <PurchaseDate>1969-07-21T02:56:03Z</PurchaseDate>
                <LastUpdateDate>1969-07-21T02:56:03Z</LastUpdateDate>
                <OrderStatus>String</OrderStatus>
                <FulfillmentChannel>String</FulfillmentChannel>
                <SalesChannel>String</SalesChannel>
                <OrderChannel>String</OrderChannel>
                <ShipServiceLevel>String</ShipServiceLevel>
                <ShippingAddress>
                    <Name>String</Name>
                    <AddressLine1>String</AddressLine1>
                    <AddressLine2>String</AddressLine2>
                    <AddressLine3>String</AddressLine3>
                    <City>String</City>
                    <County>String</County>
                    <District>String</District>
                    <StateOrRegion>String</StateOrRegion>
                    <Municipality>String</Municipality>
                    <PostalCode>String</PostalCode>
                    <CountryCode>String</CountryCode>
                    <Phone>String</Phone>
                    <AddressType>String</AddressType>
                </ShippingAddress>
                <OrderTotal>
                    <CurrencyCode>String</CurrencyCode>
                    <Amount>String</Amount>
                </OrderTotal>
                <NumberOfItemsShipped>1</NumberOfItemsShipped>
                <NumberOfItemsUnshipped>1</NumberOfItemsUnshipped>
                <PaymentExecutionDetail>
                    <PaymentExecutionDetailItem>
                        <Payment>
                        <CurrencyCode>String</CurrencyCode>
                        <Amount>String</Amount>
                        </Payment>
                        <PaymentMethod>String</PaymentMethod>
                    </PaymentExecutionDetailItem>
                </PaymentExecutionDetail>
                <PaymentMethod>String</PaymentMethod>
                <PaymentMethodDetails>
                    <PaymentMethodDetail>String</PaymentMethodDetail>
                </PaymentMethodDetails>
                <MarketplaceId>String</MarketplaceId>
                <BuyerEmail>String</BuyerEmail>
                <BuyerName>String</BuyerName>
                <BuyerCounty>String</BuyerCounty>
                <BuyerTaxInfo>
                    <CompanyLegalName>String</CompanyLegalName>
                    <TaxingRegion>String</TaxingRegion>
                    <TaxClassifications>
                        <TaxClassification>
                        <Name>String</Name>
                        <Value>String</Value>
                        </TaxClassification>
                    </TaxClassifications>
                </BuyerTaxInfo>
                <ShipmentServiceLevelCategory>String</ShipmentServiceLevelCategory>
                <ShippedByAmazonTFM>true</ShippedByAmazonTFM>
                <TFMShipmentStatus>String</TFMShipmentStatus>
                <EasyShipShipmentStatus>String</EasyShipShipmentStatus>
                <CbaDisplayableShippingLabel>String</CbaDisplayableShippingLabel>
                <OrderType>String</OrderType>
                <EarliestShipDate>1969-07-21T02:56:03Z</EarliestShipDate>
                <LatestShipDate>1969-07-21T02:56:03Z</LatestShipDate>
                <EarliestDeliveryDate>1969-07-21T02:56:03Z</EarliestDeliveryDate>
                <LatestDeliveryDate>1969-07-21T02:56:03Z</LatestDeliveryDate>
                <IsBusinessOrder>true</IsBusinessOrder>
                <PurchaseOrderNumber>String</PurchaseOrderNumber>
                <IsPrime>true</IsPrime>
                <IsPremiumOrder>true</IsPremiumOrder>
                <ReplacedOrderId>String</ReplacedOrderId>
                <IsReplacementOrder>true</IsReplacementOrder>
                <PromiseResponseDueDate>1969-07-21T02:56:03Z</PromiseResponseDueDate>
                <IsEstimatedShipDateSet>true</IsEstimatedShipDateSet>
            </Order>
        </Orders>
    </ListOrdersResult>
   <ResponseMetadata>
        <RequestId>String</RequestId>
    </ResponseMetadata>
</ListOrdersResponse>

Полный список AWS Marketplace API доступен из https://developer.amazonservices.com/javaclients.

Указанное выше XML должно отображаться в следующем классе (доступном из Amazon):

/*******************************************************************************
 * Copyright 2009-2018 Amazon Services. All Rights Reserved.
 * Licensed under the Apache License, Version 2.0 (the "License"); 
 *
 * You may not use this file except in compliance with the License. 
 * You may obtain a copy of the License at: http://aws.amazon.com/apache2.0
 * This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR 
 * CONDITIONS OF ANY KIND, either express or implied. See the License for the 
 * specific language governing permissions and limitations under the License.
 *******************************************************************************
 * List Orders Response
 * API Version: 2013-09-01
 * Library Version: 2018-10-31
 * Generated: Mon Oct 22 22:40:32 UTC 2018
 */
package com.amazonservices.mws.orders._2013_09_01.model;

import com.amazonservices.mws.client.*;

/**
 * ListOrdersResponse complex type.
 *
 * XML schema:
 *
 * 
 * <complexType name="ListOrdersResponse">
 *    <complexContent>
 *       <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *          <sequence>
 *             <element name="ListOrdersResult" type="{https://mws.amazonservices.com/Orders/2013-09-01}ListOrdersResult" minOccurs="0"/>
 *             <element name="ResponseMetadata" type="{https://mws.amazonservices.com/Orders/2013-09-01}ResponseMetadata" minOccurs="0"/>
 *          </sequence>
 *       </restriction>
 *    </complexContent>
 * </complexType>
 * 
* / publi c класс ListOrdersResponse extends AbstractMwsObject реализует MWSResponse {private ListOrdersResult listOrdersResult ; приватный ResponseMetadata responseMetadata; приватный ResponseHeaderMetadata responseHeaderMetadata; / ** * Получить значение ListOrdersResult. * * @return Значение ListOrdersResult. * / publi c ListOrdersResult getListOrdersResult () {return listOrdersResult; } / ** * Установить значение ListOrdersResult. * * @param listOrdersResult * Новое значение для установки. * / publi c void setListOrdersResult (ListOrdersResult listOrdersResult) {this.listOrdersResult = listOrdersResult; } / ** * Проверьте, установлен ли ListOrdersResult. * * @return true, если установлен ListOrdersResult. * / publi c логическое значение isSetListOrdersResult () {return listOrdersResult! = null; } / ** * Установить значение ListOrdersResult, вернуть это. * * @param listOrdersResult * Новое значение для установки. * * @return Этот экземпляр. * / publi c ListOrdersResponse withListOrdersResult (ListOrdersResult listOrdersResult) {this.listOrdersResult = listOrdersResult; верни это; } / ** * Получить значение ResponseMetadata. * * @return Значение ResponseMetadata. * / publi c ResponseMetadata getResponseMetadata () {return responseMetadata; } / ** * Установить значение ResponseMetadata. * * @param responseMetadata * Новое значение для установки. * / publi c void setResponseMetadata (ResponseMetadata responseMetadata) {this.responseMetadata = responseMetadata; } / ** * Проверьте, установлен ли ResponseMetadata. * * @return true, если установлен ResponseMetadata. * / publi c логическое значение isSetResponseMetadata () {return responseMetadata! = null; } / ** * Установите значение ResponseMetadata, верните это. * * @param responseMetadata * Новое значение для установки. * * @return Этот экземпляр. * / publi c ListOrdersResponse withResponseMetadata (ResponseMetadata responseMetadata) {this.responseMetadata = responseMetadata; верни это; } / ** * Получить значение ResponseHeaderMetadata. * * @return Значение ResponseHeaderMetadata. * / publi c ResponseHeaderMetadata getResponseHeaderMetadata () {return responseHeaderMetadata; } / ** * Установить значение ResponseHeaderMetadata. * * @param responseHeaderMetadata * Новое значение для установки. * / publi c void setResponseHeaderMetadata (ResponseHeaderMetadata responseHeaderMetadata) {this.responseHeaderMetadata = responseHeaderMetadata; } / ** * Проверьте, установлен ли ResponseHeaderMetadata. * * @return true, если установлен ResponseHeaderMetadata. * / publi c boolean isSetResponseHeaderMetadata () {return responseHeaderMetadata! = null; } / ** * Установите значение ResponseHeaderMetadata, верните это. * * @param responseHeaderMetadata * Новое значение для установки. * * @return Этот экземпляр. * / publi c ListOrdersResponse withResponseHeaderMetadata (ResponseHeaderMetadata responseHeaderMetadata) {this.responseHeaderMetadata = responseHeaderMetadata; верни это; } / ** * Чтение членов из MwsReader. * * @param r * Читатель для чтения. * / @Override publi c void readFragmentFrom (MwsReader r) {listOrdersResult = r.read ("ListOrdersResult", ListOrdersResult.class); responseMetadata = r.read ("ResponseMetadata", ResponseMetadata.class); } / ** * Запись членов в MwsWriter. * * @param w * Писатель для записи. * / @Override publi c void writeFragmentTo (MwsWriter w) {w.write ("ListOrdersResult", listOrdersResult); w.write ("ResponseMetadata", responseMetadata); } / ** * Запись тега, xmlns и членов в MwsWriter. * * @param w * Писатель для записи. * / @Override publi c void writeTo (MwsWriter w) {w.write ("https://mws.amazonservices.com/Orders/2013-09-01", "ListOrdersResponse", this); } / ** Конструктор по умолчанию. * / publi c ListOrdersResponse () {super (); }}

В этом случае у меня нет контроля над этими определениями классов. Хотя в этом случае я мог бы добавить аннотации XML вручную. Но у меня есть какой-то другой сценарий ios, где у меня нет доступа к этим определениям классов.

Ниже приводится мой верблюжий маршрут:

public class FetchNewOrdersFromAmazon extends RouteBuilder {

    @Override
    public void configure() throws Exception {

        JAXBContext jaxbContext = JAXBContext.newInstance(ListOrdersResponse.class);
        JaxbDataFormat dataFormat = new JaxbDataFormat(jaxbContext);

        from("file://data/orders/in?move=processed")
                .unmarshal(dataFormat)
                .process(new AmazonOrderTransformationProcessor())
                .marshal().json(JsonLibrary.Jackson)
                .setHeader(Exchange.FILE_NAME, simple("${file:name.noext}-${date:now:yyyyMMddHHmmssSSS}.json"))
                .to("file://data/orders/out");
    }
}

После выполнения этого кода я получаю ошибка выглядит следующим образом:

Caused by: javax.xml.bind.UnmarshalException: unexpected element (uri:"https://mws.amazonservices.com/Orders/2013-09-01", local:"ListOrdersResponse"). Expected elements are (none)
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:740) ~[jaxb-impl-2.2.11.jar:2.2.11]
    at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:262) ~[jaxb-impl-2.2.11.jar:2.2.11]
    at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:257) ~[jaxb-impl-2.2.11.jar:2.2.11]
    at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:124) ~[jaxb-impl-2.2.11.jar:2.2.11]
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext$DefaultRootLoader.childElement(UnmarshallingContext.java:1148) ~[jaxb-impl-2.2.11.jar:2.2.11]

Я думаю, добавление аннотаций XML к POJO решит эту проблему, но есть ли способ исправить эту проблему для тех классов, которые не находятся под моим контролем? Или, другими словами, можно ли исправить эту проблему, не добавляя XML аннотаций в классах Java?

Спасибо, Кушал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...