从soap响应中删除<return>元素 - JaxWs

时间:2016-05-13 22:34:24

标签: java wsdl jax-ws wsimport

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

不知何故{@ 1}}元素被添加到soap响应中,我检查了我的类,我没有看到生成的导入中的任何位置。如何删除这些?

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

<return>

}

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; } } 元素的位置。如何在jaxws中不使用soap处理程序删除它?

<return>

2 个答案:

答案 0 :(得分:3)

在您的服务端点界面中,将@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>

并且所得到的肥皂反应是裸露的(展开,没有<return>):

<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 - 服务操作只能有一个参数/输入。

答案 1 :(得分:3)

您好我有同样的问题,我的解决方案是:

在webservice文件中

@WebService(serviceName = "MyService")
public class MyService{

@WebResult(header = true, name = "ResponseLastWrapperElement", targetNamespace = "")

//包含服务

我希望这适用于更多人!!!