문제

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