IBM JAX-RPC web service : Though the response is Boolean we are getting a number in the output

StackOverflow https://stackoverflow.com/questions/17585187

Вопрос

We have a generated webservice based on WSDL using JAX-RPC, in WSDL we have response like below

<element name="notificationsResponse">
<complexType>
<sequence>
<element name="Ack" type="xsd:boolean"/>
</sequence>
</complexType>
</element>
</schema>

Even the generated code has the method return type as Boolean

public boolean notificationXXXXX(java.lang.String XXXX,
            java.lang.String XXXX, java.lang.String XXXX)

But when we invoke the service from Soap UI, we are seeing the response 'Ack' as 0, 1 not as true / false. This was working fine with JAX-WS.

Any help on this is highly appreciated

Это было полезно?

Решение

I have solved it using Handlers. Handlers can be added to webservices.xml file as below

<webservice-description>
        <webservice-description-name>XXXXXXXXXXXX</webservice-description-name>
        <wsdl-file>WEB-INF/wsdl/XXXXXXXXXXXXX.wsdl</wsdl-file>
        <jaxrpc-mapping-file>WEB-INF/XXXXXXXXXXX.xml</jaxrpc-mapping-file>
        <port-component>
            <port-component-name>XXXXXXXXXX</port-component-name>
            <wsdl-port xmlns:pfx="http://XXXXX">pfx:XXXXX</wsdl-port>
            <service-endpoint-interface>XXXXXXXXX</service-endpoint-interface>
            <service-impl-bean>
                <servlet-link>XXXXXXXXXXXX</servlet-link>
            </service-impl-bean>
             **<handler id="Handler_1066493401322">
               <handler-name>com.a.b.ResponseHandler</handler-name>
               <handler-class>com.a.b.ResponseHandler</handler-class>
            </handler>**     
        </port-component>
    </webservice-description>

Handler class should override handleResponse() method to intercept the response

import java.util.Date;
import java.util.Iterator;

import javax.xml.namespace.QName;
import javax.xml.rpc.handler.GenericHandler;
import javax.xml.rpc.handler.HandlerInfo;
import javax.xml.rpc.handler.MessageContext;
import javax.xml.rpc.handler.soap.SOAPMessageContext;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPMessage;

import org.w3c.dom.NodeList;

import com.ibm.ws.webcontainer.srt.SRTServletResponse;


public class ResponseHandler extends GenericHandler {

    protected HandlerInfo info = null;





    public boolean handleResponse(MessageContext context) {
        try {

                SOAPMessageContext smc = (SOAPMessageContext) context;
                SOAPMessage message = smc.getMessage();

                SOAPBody sb = message.getSOAPBody();


                NodeList nl = sb.getChildNodes();


                 nl= sb.getChildNodes().item(0).getChildNodes().item(0).getChildNodes();

                 String responseValue = nl.item(0).getNodeValue();

                 System.out.println("Received response value is"+ responseValue);

                 if("1".equals(responseValue))
                 {
                     System.out.println(" Setting the response value to true");
                    nl.item(0).setNodeValue("true");
                 }
                 else
                 {
                     System.out.println(" Setting the response value to false");
                     nl.item(0).setNodeValue("false");
                 }


        } catch (Exception x) {
            // insert error handling here
            x.printStackTrace();
        }
        return true;
    }


    /* (non-Javadoc)
     * @see javax.xml.rpc.handler.Handler#getHeaders()
     */
    public QName[] getHeaders() {
        return info.getHeaders();
    }

    public void init(HandlerInfo arg) {
        info = arg;
    }

    public void destroy() {
    }       
}

Другие советы

According to XML Schema Datatypes specification, Boolean may have 4 values:

booleanRep ::= 'true' | 'false' | '1' | '0'
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top