Как отлаживать JAXB, если у меня нет доступа к unmarshaller? - PullRequest
1 голос
/ 22 февраля 2012

У меня проблема с JAXB, что я понятия не имею, как решить.Это относится к демаршаллингу заголовков SOAP.В моем SOAPHandler у меня есть SOAPMessageContext объект, который имеет метод getHeaders () .Этот метод принимает QName и JAXBContext в качестве параметров и автоматически отменяет маршалирование любых совпадающих заголовков.

Моя проблема заключается в том, что я передаю соответствующие заголовки, но не маршалируемыеобъект возвращается пустым (т. е. все поля являются нулевыми).

Я немного озадачен, поскольку не могу контролировать ни один из демаршаллингов;Я не могу установить валидаторы (и посмотреть, есть ли проблема в схеме) или что-то еще, поскольку все происходит в «черном ящике».Все, что я могу передать - это JAXBContext к методу.

Есть ли что-нибудь, что я могу сделать, чтобы выяснить, почему происходит сбой демаршаллинга, даже если не выдается исключение?

Спасибо

Эрик

1 Ответ

0 голосов
/ 22 февраля 2012

Ладно - так что после нескольких царапин на голове я понял, что могу сам попытаться тиражировать метод getHeaders () и включить валидацию / etc в unmarshaller, чтобы выяснить, в чем проблема.

Iв итоге извлек заголовок как узел xml, используя следующее:

        SOAPHeader soapHeader = context.getMessage().getSOAPHeader();
        Object z;
        XMLUtil xmlUtil = new XMLUtil();
        for( Iterator<SOAPElement> it = soapHeader.getChildElements(new ObjectFactory().createServiceContext(null).getName()); it.hasNext(); ){
            SOAPElement sc = it.next();
            z = xmlUtil.unmarshall(sc, ServiceContextType.class);
        }

В своем классе xmlUtil я могу создать свой собственный unmarshaller JAXB и включить проверку схемы, а не полагаться только на метод getHeaders (), чтобы сделатьвсе волшебно для меня.

Надеюсь, это может быть полезно для кого-то еще.

Спасибо,

Эрик

...