Java 在EJB3 WebService中将Hashmap作为参数传递
我已经将EJB3Bean的api公开为Web服务,它将java的HashMap作为参数,但是当从HashMap获取Web服务bean中的值时,我得到的是空值Java 在EJB3 WebService中将Hashmap作为参数传递,java,web-services,jakarta-ee,jax-ws,ejb-3.0,Java,Web Services,Jakarta Ee,Jax Ws,Ejb 3.0,我已经将EJB3Bean的api公开为Web服务,它将java的HashMap作为参数,但是当从HashMap获取Web服务bean中的值时,我得到的是空值 @EJB(mappedName = "ODBillGenerationSession",name = "ODBillGenerationSession") IODBillGenerationSessionRemoteHome iodBillGenerationSessionRemoteHome = null; IODBillGenerati
@EJB(mappedName = "ODBillGenerationSession",name = "ODBillGenerationSession")
IODBillGenerationSessionRemoteHome iodBillGenerationSessionRemoteHome = null;
IODBillGenerationSessionRemote iodBillGenerationSessionRemote = null;
public String echo(@WebParam(name="hashMap") HashMap hashMap) {
return "Hello "+hashMap.get("name");
}
我从SOAP UI执行的请求XML如下所示:-
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:int="http://interfaces.billingengine.ws.billingengine.elitecore.com/"> <soapenv:Header/> <soapenv:Body>
<int:echo>
<!--Optional:-->
<arg0>Test</arg0>
</int:echo> </soapenv:Body> </soapenv:Envelope>
试验
当我传递java字符串对象时,相同的web服务工作正常
我想我在这里遗漏了一些注释,我搜索过但没有找到
<definitions name="ODBillGenerationWsSessionFacadeService" targetNamespace="http://session.billingengine.ws.billingengine.elitecore.com/">
<import location="http://10.105.1.6:8180/odbillgeneration-ws/ODBillGenerationWsSessionFacade?wsdl&resource=IODBillGenerationWsSessionRemote_PortType6834015600007002099.wsdl" namespace="http://interfaces.billingengine.ws.billingengine.elitecore.com/"/>
<service name="ODBillGenerationWsSessionFacadeService">
<port binding="ns1:IODBillGenerationWsSessionRemoteBinding" name="ODBillGenerationWsSessionFacadePort">
<soap:address location="http://10.105.1.6:8180/odbillgeneration-ws/ODBillGenerationWsSessionFacade"/>
</port>
</service>
正确的WSDL
<definitions name="ODBillGenerationWsSessionFacadeService" targetNamespace="http://interfaces.billingengine.ws.billingengine.elitecore.com/">
<types>
<xs:schema targetNamespace="http://interfaces.billingengine.ws.billingengine.elitecore.com/" version="1.0">
<xs:element name="echo" type="tns:echo"/>
<xs:element name="echoResponse" type="tns:echoResponse"/>
<xs:complexType name="echo">
<xs:sequence>
<xs:element minOccurs="0" name="arg0" type="tns:hashMap"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="hashMap">
<xs:complexContent>
<xs:extension base="tns:abstractMap">
<xs:sequence/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType abstract="true" name="abstractMap">
<xs:sequence/>
</xs:complexType>
<xs:complexType name="echoResponse">
<xs:sequence>
<xs:element minOccurs="0" name="return" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
</types>
<message name="IODBillGenerationWsSessionRemote_echoResponse">
<part element="ns1:echoResponse" name="echoResponse"/>
</message>
<message name="IODBillGenerationWsSessionRemote_echo">
<part element="ns1:echo" name="echo"/>
</message>
<portType name="IODBillGenerationWsSessionRemote">
<operation name="echo" parameterOrder="echo">
<input message="ns1:IODBillGenerationWsSessionRemote_echo"/>
<output message="ns1:IODBillGenerationWsSessionRemote_echoResponse"/>
</operation>
</portType>
<binding name="IODBillGenerationWsSessionRemoteBinding" type="ns1:IODBillGenerationWsSessionRemote">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="echo">
<soap:operation soapAction=""/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
</definitions>
您没有发送键值对,因此您的Web方法无法读取所需的键“名称”。将SOAP主体替换为以下主体:
<soapenv:Body>
<int:echo>
<hashMap>
<!--Zero or more repetitions:-->
<arg0>
<key>name</key>
<value>someValue</value>
</arg0>
</hashMap>
</int:echo>
</soapenv:Body>
名称
一些价值
另外,将输入参数的类型从
HashMap
更改为HashMap
。这应该可以解决问题。@Milijen:-已经粘贴了WSDL,但它不是手动创建的,而是由JBOSS 5生成的。是否有一些外部XSD或包含定义的东西?我想查看“hashMap”输入参数的映射。不,没有外部XSD或包含定义的内容。我使用了上面代码段中提到的注释,其中提到了api echo details.OK,但注释最终映射到某种配置中。外部客户端如何知道要发送给Web方法的参数类型?我可以看到您正在导入IODBillGenerationWsSessionRemote_portType683401560007002099.wsdl和ODBillGenerationWsSessionFacade.wsdl,它们可能包含必需的定义。@Milijen:谢谢,但仍然不起作用。。。我必须使用tag else给予NullPointerException。我已经更新了答案,尝试更改Web方法中参数的类型,然后重试。@Milijen:谢谢您的努力。但是值仍然是空的。您可以公开服务并发布URL吗?我想试试看问题出在哪里。请同时添加运行Web服务的Metro版本(或至少是应用服务器版本)。