【问题标题】:Remove <return> element from soap response - JaxWs从肥皂响应中删除 <return> 元素 - JaxWs
【发布时间】:2016-09-10 06:12:08
【问题描述】:

我有以下类,我基本上是在重写一些现有服务,并且必须使用“wsimport”从 wsdl 生成以下类。 Soap 响应必须与它过去在遗留代码中返回的方式完全相同。以下是导入生成的类。

不知何故,&lt;return&gt; 元素被添加到了肥皂响应中,我检查了我的类,但在生成的导入中没有看到任何地方。关于如何删除这些的任何想法?

我在这里查看了这个解决方案Remove element <return> in JAX-WS SOAP Response,但它对我来说并不理想。

package org.openuri;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import net.tds.msa.address.addressvalues.Values;

/**
 * <p>Java class for anonymous complex type.
 * 
 * <p>The following schema fragment specifies the expected content contained within this class.
 * 
 * <pre>
 * &lt;complexType>
 *   &lt;complexContent>
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *       &lt;sequence>
 *         &lt;element ref="{http://xx.net/msa/Address/AddressValues.xsd}AddressValuesResponse"/>
 *       &lt;/sequence>
 *     &lt;/restriction>
 *   &lt;/complexContent>
 * &lt;/complexType>
 * </pre>
 * 
 * 
 */

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "addressValuesResponse"
})
@XmlRootElement(name = "getPostDirectionalResponse")

public class GetPostDirectionalResponse {

@XmlElement(name = "AddressValuesResponse", namespace = "http://xx.net/msa/Address/AddressValues.xsd", required = true)
protected Values addressValuesResponse;

/**
 * Gets the value of the addressValuesResponse property.
 * 
 * @return
 *     possible object is
 *     {@link Values }
 *     
 */
public Values getAddressValuesResponse() {
    return addressValuesResponse;
}

/**
 * Sets the value of the addressValuesResponse property.
 * 
 * @param value
 *     allowed object is
 *     {@link Values }
 *     
 */
public void setAddressValuesResponse(Values value) {
    this.addressValuesResponse = value;
}

}

package net.xx.msa.address.addressvalues;

import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;


/**
 * <p>Java class for values complex type.
 * 
 * <p>The following schema fragment specifies the expected content contained within this class.
 * 
 * <pre>
 * &lt;complexType name="values">
 *   &lt;complexContent>
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *       &lt;sequence>
 *         &lt;element name="AddressValue" type="{http://xx.net/msa/Address/AddressValues.xsd}AddressValue" maxOccurs="unbounded" minOccurs="0"/>
 *       &lt;/sequence>
 *     &lt;/restriction>
 *   &lt;/complexContent>
 * &lt;/complexType>
 * </pre>
 * 
 * 
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "values", propOrder = {
    "addressValue"
})
public class Values {

    @XmlElement(name = "AddressValue")
    protected List<AddressValue> addressValue;

    /**
     * Gets the value of the addressValue property.
     * 
     * <p>
     * This accessor method returns a reference to the live list,
     * not a snapshot. Therefore any modification you make to the
     * returned list will be present inside the JAXB object.
     * This is why there is not a <CODE>set</CODE> method for the addressValue property.
     * 
     * <p>
     * For example, to add a new item, do as follows:
     * <pre>
     *    getAddressValue().add(newItem);
     * </pre>
     * 
     * 
     * <p>
     * Objects of the following type(s) are allowed in the list
     * {@link AddressValue }
     * 
     * 
     */
    public List<AddressValue> getAddressValue() {
        if (addressValue == null) {
            addressValue = new ArrayList<AddressValue>();
        }
        return this.addressValue;
    }

}

响应是添加&lt;return&gt; 元素的位置。如何在不使用 jaxws 中的肥皂处理程序的情况下删除它?

<ns3:getPostDirectionalResponse xmlns:ns2="http://xx.net/msa/Address/AddressValues.xsd" xmlns:ns3="http://www.openuri.org/">
         <return>
            <ns2:AddressValuesResponse>
               <ns2:AddressValue>
                  <ns2:value>South</ns2:value>
                  <ns2:valueAbbrev>S</ns2:valueAbbrev>
              </ns2:AddressValuesResponse>
          </return>
  </ns3:getPostDirectionalResponse>

【问题讨论】:

    标签: java wsdl jax-ws wsimport


    【解决方案1】:

    在您的服务端点接口中,将@SOAPBinding(parameterStyle=ParameterStyle.BARE) 添加到您的@WebMethod

    package org.openuri;
    
    import javax.jws.WebMethod;
    import javax.jws.WebService;
    import javax.jws.soap.SOAPBinding;
    import javax.jws.soap.SOAPBinding.ParameterStyle;
    
    @WebService
    public interface ExampleService {
    
        @WebMethod
        @SOAPBinding(parameterStyle=ParameterStyle.BARE)
        GetPostDirectionalResponse getPostDirectional(String input);
    }
    

    这会将getPostDirectionalResponse 元素的生成架构(对我而言)更改为:

    <xs:element name="getPostDirectionalResponse">
    <xs:complexType>
    <xs:sequence>
    <xs:element name="AddressValuesResponse" type="tns:values" form="qualified"/>
    </xs:sequence>
    </xs:complexType>
    </xs:element>
    

    得到的soap响应是裸露的(未包装,没有&lt;return&gt;):

    <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
       <S:Body>
          <ns3:getPostDirectionalResponse xmlns:ns2="http://xx.net/msa/Address/AddressValues.xsd" xmlns:ns3="http://openuri.org/">
             <ns2:AddressValuesResponse>
                <AddressValue>hello</AddressValue>
             </ns2:AddressValuesResponse>
          </ns3:getPostDirectionalResponse>
       </S:Body>
    </S:Envelope>
    

    但是,BARE 带有a constraint - 服务操作只能有一个参数/输入。

    【讨论】:

    • 太棒了!这就像一个魅力,我不得不稍微调整一下服务,但效果完美。
    【解决方案2】:

    您好,我遇到了同样的问题,我的解决方案是:

    在网络服务文件中

    @WebService(serviceName = "MyService")
    public class MyService{
    
    @WebResult(header = true, name = "ResponseLastWrapperElement", targetNamespace = "")
    

    //服务的包含

    我希望这对更多人有用!!!

    【讨论】:

    • 为我工作。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2019-10-01
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多