2017-01-06 4 views
0

У меня установлено уведомление об электронном eBay, и я хочу преобразовать содержимое уведомлений (это SOAP XML) в объект Java GetItemTransactionsResponse. Ниже приведен код, который я использую.Преобразование eBay SOAP-ответа на объект Java

SOAPMessage message = MessageFactory.newInstance().createMessage(null, 
        new ByteArrayInputStream(
          CONVERT_EBAY_NOTIFICATION_TO_BYTE_ARRAY_METHOD() 
        )); 
SOAPEnvelope soapEnv = message.getSOAPPart().getEnvelope(); 
SOAPBody soapBody = message.getSOAPBody(); 
JAXBContext content = JAXBContext.newInstance(GetItemTransactionsResponseType.class); 
Unmarshaller unmarshaller = content.createUnmarshaller(); 
JAXBIntrospector jaxbIntrospector = content.createJAXBIntrospector(); 
Object transactionObject = unmarshaller.unmarshal(soapBody, GetItemTransactionsResponseType.class); 
GetItemTransactionsResponseType transaction = (GetItemTransactionsResponseType)jaxbIntrospector.getValue(transactionObject); 

Я думал, это будет преобразовать SOAP XML в соответствующий eBay объект, но он не работает, потому что «сделка» объект пустой ... Я пытался получить доступ к переменной в «операции» объект

transaction.getItem() 

и я получаю NullPointerException ...

затем проверить мой объект SOAPBody, чтобы увидеть, если я передаю в пустом содержании, которое вызывает NullPointerException

soapBody.getTextContent() 

Я вижу содержимое текста внутри объекта soapBody. Это не пусто!

Я бы очень признателен за любую помощь, которая могла бы решить эту проблему. Не уверен, что я неправильно конвертирую SOAP XML. Заранее спасибо!

ответ

0

Ну как-то мне удалось разобраться с проблемой.

мне на самом деле нужно, чтобы получить часть тела SOAP XML с помощью документа:

Document document = soapBody.extractContentAsDocument(); 

Тогда я маршализацию объект Document вместо объекта SOAPBody, в объект:

Object transactionObject = unmarshaller.unmarshal(document); 

Наконец I используйте JAXBIntrospector для получения значения объекта, а также передайте объект классу GetItemTransactionsResponseType, как то, что я сделал первоначально:

GetItemTransactionsResponseType transaction = (GetItemTransactionsResponseType)jaxbIntrospector.getValue(transactionObject); 

Я собираюсь оставить здесь код, чтобы с надеждой помочь кому-то, кто борется, как я.

SOAPMessage message = MessageFactory.newInstance().createMessage(null, 
        new ByteArrayInputStream(
          REPLACE_THIS_WITH_YOUR_IMPLEMENTATION_TO_GET_YOUR_SOURCE() 
        )); 
SOAPBody soapBody = message.getSOAPBody(); 
Document document = soapBody.extractContentAsDocument(); 
JAXBContext content = JAXBContext.newInstance(GetItemTransactionsResponseType.class); 
Unmarshaller unmarshaller = content.createUnmarshaller(); 
JAXBIntrospector jaxbIntrospector = content.createJAXBIntrospector(); 
Object transactionObject = unmarshaller.unmarshal(document);    
GetItemTransactionsResponseType transaction = (GetItemTransactionsResponseType)jaxbIntrospector.getValue(transactionObject);