У меня есть веб-сервис на моем 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?