我的JBoss 7.1.3上有一个Web服务(也曾在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使用JAXB的redhat实现(com.sun.xml.bind/jaxb-impl/2.2.11.redhat-4
)。我发送的肥皂信封看起来像这样。
<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>
我想在解析nachrichten:message
起始标记时引发NPE,该起始标记包含该元素的具体类型的注释。但是我看不出这里有什么问题。
我得到了一些xsds和一个wsdl定义,从它们生成了我的java类和webservice接口。我的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
值的soap请求时,NPE不会出现并且一切正常。
为什么会抛出NPE? soap xml或xsd有什么问题?