我正在从 WSDL 创建一个 Web 服务客户端。
对服务的典型 SOAP 请求如下所示
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:someGateway">
<soapenv:Header/>
<soapenv:Body>
<urn:send>
<urn:message>
<urn:messageID>1001</urn:messageID>
<urn:messageBody>
<DataContainer>
SOME MORE ELEMENTS
</DataContainer>
</urn:messageBody>
</urn:message>
</urn:send>
</soapenv:Body>
</soapenv:Envelope>
我使用 JAX-WS 生成服务工件并填充我的对象,如下所示:
Message message = objectFactory.createMessage();
//Set message ID
String messageID = "123456"
message.setMessageID(messageID );
//Set message Body
MessageBody messageBody = objectFactory.createMessageMessageBody()
messageBody 对象只有 1 个方法 messageBody.setAny(value)。但我需要在其中放置一个 DataContainer 元素。
我尝试过通过:
- org.w3c.dom.DocumentObject(我收到“javax.xml.ws.soap.SOAPFaultException:无法处理请求。”)可能是由于 xml 解析所致。
- DataContainer 由 JAXB 从 XSD 生成的对象(我得到“[javax.xml.bind.JAXBException:此上下文中已知类 DataContainer 及其任何父类(super class)]”)
- JAXBElement(我得到“[javax.xml.bind.JAXBException:此上下文不知道类 DataContainer]”)
我做错了什么?或者我需要做什么才能获取消息正文中的 DataContainer
最佳答案
正如您提到的,您有 messageBody.setAny(value)
这意味着XSI:type
MessageBody 已设置为 anytype
。这意味着您可以在那里设置任何对象,但注意的是 JAXB 应该能够在 JAX-WS wsdl2java 工具定义的上下文中对其进行编码。从错误消息“无法在 Conext 中找到 DataContainer”来看,您的 DataContainer 类似乎不在同一上下文中。
这里有一个解决方法,您可以将 DataContainer 对象编码到 JAXBElement<String>
(或者可能只是一个字符串,但我不确定这是否有效)对象,然后将其设置为anyType。这样您就不会在上下文中得到 Class not Know,因为 String 是基本的 JAXB 类型。
我不知道当你尝试使用第2点或第3点时你是如何定义你的包结构的,所以我在这里进行了一次疯狂的尝试。从错误消息来看,您单独生成的 DataContainer 类似乎与 Message 及其子类不在同一个包中。尝试将 DataContainer 及其关联类移至与 Message 类相同的包,并将两个 ObjectFactory 类合并在一起。这应该允许 JAXB 在与 Message 相同的“上下文”中找到 DataContainer。
当您发出实际请求并且 JAXB 正在编码对象以创建请求时(即 JAX-WS 在内部调用 JAXB 编码服务),可能会发生该错误。在这种情况下,当您生成客户端时,JAXBContext 被设置为 Message 类所在的包。
这里是一个处理 JAXBContext 编码和解码的简单教程。 http://download.oracle.com/docs/cd/E17802_01/webservices/webservices/docs/1.6/tutorial/doc/JAXBUsing3.html
同时按照this ,您可以将 anyType 设置为 org.w3c.dom.Element 而不是 org.w3c.dom.Document
关于java - 从 WSDL 开发 Web 服务客户端时出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6514180/