NPE при распаковке мыльного конверта - PullRequest
0 голосов
/ 15 января 2019

У меня есть веб-сервис на моем JBoss 7.1.3 (также пробовал с версией 6.x.x), который я пытаюсь проверить, отправляя запрос на мыло. Когда я получаю неприятный NPE без сообщений об ошибках от JAXB.

11:30:01,415 WARNING [org.apache.cxf.phase.PhaseInterceptorChain] (default task-4) Interceptor for {urn:de:deutscherv:bund:marvin:bus:connectors:ejbs}HZKConnectorService#{urn:de:deutscherv:bund:marvin:bus:connectors:ejbs}send has thrown exception, unwinding now: java.lang.NullPointerException
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl.getNearestTypeName(JAXBContextImpl.java:655)
    at com.sun.xml.bind.v2.runtime.unmarshaller.XsiTypeLoader.parseXsiType(XsiTypeLoader.java:113)
    at com.sun.xml.bind.v2.runtime.unmarshaller.XsiTypeLoader.startElement(XsiTypeLoader.java:74)
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:576)
    ...

JBoss использует реализацию redhat (com.sun.xml.bind/jaxb-impl/2.2.11.redhat-4) JAXB. Мыльный конверт, который я отправляю, выглядит следующим образом.

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xmlns:nachrichten="urn:de:deutscherv:bund:marvin:domain:nachrichten"
              xmlns:rvglobal="urn:de:deutscherv:bund:marvin:domain:nachrichten:rvglobal">
<soapenv:Header/>
<soapenv:Body>
    <nachrichten:send>
        <nachrichten:message xsi:type="rvglobal:rvGlobalNachricht">
            <!--snip-->
        </nachrichten:message>
        <!--snip-->
    </nachrichten:send>
</soapenv:Body>

Я предполагаю, что NPE выбрасывается при синтаксическом анализе начального тега nachrichten:message, содержащего аннотацию для конкретного типа для этого элемента. Однако я не вижу, что здесь не так. Я получил некоторые xsds и wsdl, из которых я сгенерировал классы java и интерфейс веб-сервиса. Схема для моего rvGlobalNachricht типа выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:nachrichten="urn:de:deutscherv:bund:marvin:domain:nachrichten" xmlns:rvglobal="urn:de:deutscherv:bund:marvin:domain:nachrichten:rvglobal" targetNamespace="urn:de:deutscherv:bund:marvin:domain:nachrichten:rvglobal" elementFormDefault="qualified" id="ws_rvglobal_connector" jxb:version="2.0">
    <xsd:import namespace="urn:de:deutscherv:bund:marvin:domain:nachrichten" schemaLocation="ws_connector.xsd"/>
    <xsd:annotation>
        <xsd:appinfo>
            <jxb:schemaBindings>
                <jxb:package name="de.deutscherv.bund.marvin.domain.nachrichten.rvglobal">
                    <jxb:javadoc>MarVIn RvGlobal Nachrichten</jxb:javadoc>
                </jxb:package>
            </jxb:schemaBindings>
        </xsd:appinfo>
    </xsd:annotation>
    <xsd:complexType name="rvGlobalNachricht">
        <xsd:complexContent>
            <xsd:extension base="nachrichten:nachricht">
                <!--snip-->
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <!--snip-->
</xsd:schema>

В wsdl я импортирую все необходимые xsds.

Странная вещь: когда я отправляю запрос мыла с другим значением для xsi:type в элементе nachrichten:message, NPE не появляется, и все работает нормально.
Почему выбрасывают NPE? Что не так с мылом XML или XSD?

...