【问题标题】:Unable to add sibling node into soap response无法将兄弟节点添加到肥皂响应中
【发布时间】:2015-04-26 04:04:42
【问题描述】:

大家好,我需要如下生成soap响应。我已将其生成到“GetTestDetailResult”节点。但无法将“国家”添加为根节点的子节点(GetTestDetailResponse)。

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <GetTestDetailResponse>
      <GetTestDetailResult>
        <id>string</id>
        <fname>string</fname>
        <lname>string</lname>
      </GetTestDetailResult>
      <country>string</country>
      <age>int</age>
    </GetTestDetailResponse>
  </soap:Body>
</soap:Envelope>

我的wsdl文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="TestServiceService" targetNamespace="http://www.test.org/"
                  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
                  xmlns:tns="http://www.test.org/"
                  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
    <wsdl:types>
        <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
                   xmlns:tns="http://www.test.org/"
                   attributeFormDefault="unqualified"
                   elementFormDefault="unqualified"
                   targetNamespace="http://www.test.org/">

            <xs:element name="GetTestDetail" type="tns:GetTestDetail"/>
            <xs:element name="GetTestDetailResponse" type="tns:GetTestDetailResponse"/>

            <xs:complexType name="GetTestDetail">
                <xs:sequence>
                    <xs:element minOccurs="0" name="email" type="xs:string"/>
                </xs:sequence>
            </xs:complexType>

            <xs:complexType name="GetTestDetailResponse">
                <xs:sequence>
                    <xs:element  minOccurs="1" name="GetTestDetailResult" type="tns:GetTestDetailResult"/>
                </xs:sequence>
            </xs:complexType>

            <xs:complexType name="GetTestDetailResult">
                <xs:sequence>
                    <xs:element minOccurs="0" name="id" type="xs:string"/>
                    <xs:element minOccurs="0" name="fname" type="xs:string"/>
                    <xs:element minOccurs="0" name="lname" type="xs:string"/>
                    <xs:element minOccurs="0" name="authFailed" type="xs:string"/>
                    <xs:element minOccurs="0" name="soapMessage" type="xs:string"/>
                </xs:sequence>
            </xs:complexType>
         </xs:schema>
    </wsdl:types>

    <wsdl:message name="GetTestDetail">
        <wsdl:part name="parameters" element="tns:GetTestDetail"/>
    </wsdl:message>

    <wsdl:message name="GetTestDetailResponse">
        <wsdl:part name="parameters" element="tns:GetTestDetailResponse"/>
    </wsdl:message>


    <wsdl:portType name="TestServiceWsdlEndpointPortType">
        <wsdl:operation name="GetTestDetail">
            <wsdl:input name="GetTestDetail" message="tns:GetTestDetail"/>
            <wsdl:output name="GetTestDetailResponse" message="tns:GetTestDetailResponse"/>
        </wsdl:operation>
    </wsdl:portType>

    <wsdl:binding name="TestServiceWsdlEndpointBinding" type="tns:TestServiceWsdlEndpointPortType">
        <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>

        <wsdl:operation name="GetTestDetail">
            <soap:operation soapAction="" style="document"/>
            <wsdl:input name="GetTestDetail">
                <soap:body use="literal"/>
            </wsdl:input>
            <wsdl:output name="getTestDetailResponse">
                <soap:body use="literal"/>
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>

    <wsdl:service name="TestServiceWsdlEndpoint">
        <wsdl:port name="TestServiceWsdlPort" binding="tns:TestServiceWsdlEndpointBinding">
            <soap:address location="http://localhost:8080/test/services/TestServiceWsdl"/>
        </wsdl:port>
    </wsdl:service>

</wsdl:definitions>

我的响应式 Java 类是:-

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlType;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "testDetail", propOrder = {
        "id",
        "fname",
        "lname"

})

public class TestDetail {

    protected String id;
    protected String fname;
    protected String lname;

    protected String authFailed;
    protected String soapMessage;


    public String getId() {
        return id;
    }

    public void setId(String value) {
        this.id = value;
    }

    public String getFname() {
        return fname;
    }

    public void setFname(String value) {
        this.fname = value;
    }

    public String getLname() {
        return lname;
    }

    public void setLname(String value) {
        this.lname = value;
    }

    public String getAuthFailed() {
        return authFailed;
    }

    public void setAuthFailed(String value) {
        this.authFailed = value;
    }

    public String getSoapMessage() {
        return soapMessage;
    }

    public void setSoapMessage(String value) {
        this.soapMessage = value;
    }

 }

【问题讨论】:

  • 你能发布你的错误信息吗?

标签: java xml soap xsd wsdl


【解决方案1】:

我还不能发表评论(没有足够的代表)来澄清,但是当你说你不能将 country 添加为 GetTestDetailResponse 的子元素时,我认为你遇到了 XML 无效错误。

查看 WSDL 中的 XML 架构,没有定义 country 元素

  <xs:element name="GetTestDetailResponse" type="tns:GetTestDetailResponse"/>

因此,将类型更改为类似这样应该可以:

  <xs:complexType name="GetTestDetailResponse">
     <xs:sequence>
        <xs:element  minOccurs="1" name="GetTestDetailResult" type="tns:GetTestDetailResult"/>
        <xs:element minOccurs="0" name="country" type="xs:string"/>
        <xs:element minOccurs="0" name="age" type="xs:integer"/>
     </xs:sequence>
  </xs:complexType>

我还添加了年龄,因为那样会有类似的问题。

【讨论】:

  • 迈克,当我尝试添加以下行时,应用程序没有出现。
  • @sumit-verma 当你说“没有出现”时——你得到一个特定的错误吗?您是否还向 Java 类添加了注释?
  • 消息:创建名为“testServiceWsdlEndpointBean”的 bean 时出错:bean 实例化失败;嵌套异常是 org.springframework.beans.factory.BeanDefinitionStoreException:工厂方法 [public org.apache.cxf.endpoint.Server org.apache.cxf.jaxws.JaxWsServerFactoryBean.create()] 抛出异常;嵌套异常是 java.lang.NullPointerException
  • 我没有看到日志。不确定 StackOverflow 将它们放在哪里。我建议为您的 JAXB 对象编写一个测试用例,看看您是否生成了预期的 XML。根据发布的 Java 代码,这似乎是不完整的。
  • 这些是日志:- 消息:创建名称为“testServiceWsdlEndpointBean”的 bean 时出错:bean 的实例化失败;嵌套异常是 org.springframework.beans.factory.BeanDefinitionStoreException:工厂方法 [public org.apache.cxf.endpoint.Server org.apache.cxf.jaxws.JaxWsServerFactoryBean.create()] 抛出异常;嵌套异常是 java.lang.NullPointerException
猜你喜欢
  • 1970-01-01
  • 2023-01-16
  • 1970-01-01
  • 2021-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多