2016-05-13 69 views
2

我有以下類,我基本上重寫了一些現有的服務,並且必須使用'wsimport'從wsdl生成以下類。 Soap響應必須與傳統代碼中返回的方式完全相似。以下是導入中生成的類。從肥皂反應中刪除<return>元素 - JaxWs

不知何故<return>元素被添加到肥皂響應中,我檢查了我的類,並且在生成的導入中沒有看到任何地方。任何想法如何刪除這些?

我在這裏查看這個解決方案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; 
    } 

} 

響應是其中加入<return>元件。如何在不使用jaxws中的soap處理程序的情況下刪除它?

<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> 

回答

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 - 服務操作只能有一個參數/輸入。

+0

太棒了!像魅力一樣工作,我不得不稍微調整一下這個服務,但是這個工作完美無瑕。 – Zeus

2

嗨,我有同樣的問題,我的解決辦法是:

在web服務文件

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

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

//將包含服務

我希望這個作品爲更多人的! !