Search code examples
javawsdljax-wswsimport

Remove <return> element from soap response - JaxWs


I have the following Classes, I'm basically re-writing some existing services and had to use 'wsimport' to generate the following classes from the wsdl. The Soap response has to be exactly similar to how it used to return in the legacy code. The following is the generated classes from the import.

Somehow the <return> element got added to the soap response, I've checked my classes and I do not see that anywhere in the imports that were generated. Any idea on how to remove these?

I looked at this solution here Remove element <return> in JAX-WS SOAP Response but it is not ideal for me.

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

}

and

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

}

Response is where <return> element is added. How do I remove this without using soap handler in 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>

Solution

  • In your service endpoint interface, add @SOAPBinding(parameterStyle=ParameterStyle.BARE) to your @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);
    }
    

    This changes the generated schema (for me) for getPostDirectionalResponse element to:

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

    and the resultant soap response is bare (unwrapped, no <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>
    

    However, BARE comes with a constraint - the service operation can only have one argument/input.