2016-05-13 4 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?

<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

Привет я была такая же проблема, и мое решение было:

в WebService файле

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

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

// содержат службы

Я надеюсь, что это работает для большего числа людей !! !