java - 从 WSDL 开发 Web 服务客户端时出现异常

标签 java wsdl jaxb wsimport

我正在从 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 元素。

我尝试过通过:

  1. org.w3c.dom.DocumentObject(我收到“javax.xml.ws.soap.SOAPFaultException:无法处理请求。”)可能是由于 xml 解析所致。
  2. DataContainer 由 JAXB 从 XSD 生成的对象(我得到“[javax.xml.bind.JAXBException:此上下文中已知类 DataContainer 及其任何父类(super class)]”)
  3. 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/

相关文章:

java.lang.IllegalArgumentException : No enum const class 异常

java - 在 Eclipse 中传递 javac 参数

java - 使用 apache axis 从 wsdl 创建 Web 服务

.net - 如何为 .Net 中的 SOAP/Web 服务类生成 HTML 文档?

web-services - ColdFusion 无法识别 WSDL GUID 数据类型?

java - 使用 xjc 从 xsd 生成类

java - 从 WAR 文件获取文件

java - 如何从 GAE Java 通过代理发送基本的 HTTP GET?

java - 如何在 Android 上激活按钮的点击事件?

java - 在 JAXB 或 Xstream 中,是否可以在解码期间过滤掉类型/值上的某些子元素