1

JAX-RPC を使用して WSDL に基づいて生成された Web サービスがあります。WSDL では、以下のような応答があります。

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

生成されたコードでさえ、メソッドの戻り値の型が Boolean になっています

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

しかし、Soap UI からサービスを呼び出すと、応答 'Ack' が true / false ではなく 0、1 として表示されます。これは JAX-WS で問題なく動作していました。

これに関するヘルプは大歓迎です

4

2 に答える 2

0

XML Schema Datatypes specificationによると、ブール値には次の 4 つの値があります。

booleanRep ::= 'true' | 'false' | '1' | '0'
于 2013-07-13T11:48:18.907 に答える
0

ハンドラーを使用して解決しました。以下のように、ハンドラーを webservices.xml ファイルに追加できます。

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

ハンドラー クラスは、handleResponse() メソッドをオーバーライドして、応答をインターセプトする必要があります。

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() {
    }       
}
于 2013-09-03T08:20:00.557 に答える