Axis2 Web服务存根失败

时间:2014-08-28 01:22:48

标签: axis2

我们有一个用Java编写的网站,可以进行Web服务调用。最近,我们注意到我们正在收到来自Web服务的null响应(端点是我们未维护的第三方)。 我已经找到了我们的代码失败的点,它在我们的存根中。请参阅下面的代码,代码在两个System.out.println行之间失败。我的问题是没有抛出异常,所以我不知道为什么_operationClient.execute(true);失败。有人会知道如何解决这个问题吗?

    public SuggestXResponseE suggestX(SuggestXE suggestX0)
            throws java.rmi.RemoteException {
        org.apache.axis2.context.MessageContext _messageContext = null;
        try {
            org.apache.axis2.client.OperationClient _operationClient = _serviceClient.createClient(_operations[0].getName());
            _operationClient.getOptions().setAction("http://www.test.com/service/suggestX");
            _operationClient.getOptions().setExceptionToBeThrownOnSOAPFault(true);


            addPropertyToOperationClient(_operationClient, org.apache.axis2.description.WSDL2Constants.ATTR_WHTTP_QUERY_PARAMETER_SEPARATOR, "&");

            // create a message context
            _messageContext = new org.apache.axis2.context.MessageContext();


            // create SOAP envelope with that payload
            org.apache.axiom.soap.SOAPEnvelope env = null;

            env = toEnvelope(getFactory(_operationClient.getOptions().getSoapVersionURI()),
                    suggestX0,
                    optimizeContent(new javax.xml.namespace.QName("http://www.test.com/service",
                    "suggestX")));
            //adding SOAP soap_headers
            _serviceClient.addHeadersToEnvelope(env);
            // set the message context with that soap envelope
            _messageContext.setEnvelope(env);
            // add the message contxt to the operation client
            _operationClient.addMessageContext(_messageContext);

System.out.println("Log message 1");
            //execute the operation client
            _operationClient.execute(true);
System.out.println("Log message 2");

            org.apache.axis2.context.MessageContext _returnMessageContext = _operationClient.getMessageContext(
                    org.apache.axis2.wsdl.WSDLConstants.MESSAGE_LABEL_IN_VALUE);
            org.apache.axiom.soap.SOAPEnvelope _returnEnv = _returnMessageContext.getEnvelope();

            java.lang.Object object = fromOM(
                    _returnEnv.getBody().getFirstElement(),
                    SuggestXResponseE.class,
                    getEnvelopeNamespaces(_returnEnv));

            return (SuggestXResponseE) object;

        } catch (org.apache.axis2.AxisFault f) {
        // Handle exception.
    } 
        finally {
            _messageContext.getTransportOut().getSender().cleanup(_messageContext);
        }
    }

1 个答案:

答案 0 :(得分:2)

System.out.println("Log message 1");
        //execute the operation client
        _operationClient.execute(true);
System.out.println("Log message 2");

如果您收到第一条日志消息而不是第二条消息,则会发生以下两种情况之一:

  1. System.exit()正在_operationClient.execute()内的某个地方被调用。你可以通过流程退出来认识到这一点。

  2. 更有可能的是,_operationClient.execute()正在抛出一些东西。

  3. 你说它不会抛出异常,但它可能会抛出Error或其他类型的Throwable。通常不建议捕获非异常throwable,但是你可以添加一些代码来暂时执行:

    try {
        _operationClient.execute(true);
    } catch (Throwable t) {
        log.error(t);
        throw t;
    }
    

    您可能会发现自己获得了OutOfMemoryErrorNoClassDefFoundError,因为部署中缺少某些jar,例如。