【问题标题】:Axis2 web service stub failingAxis2 Web 服务存根失败
【发布时间】:2014-08-28 09:46:46
【问题描述】:

我们有一个用 Java 编写的网站,可以调用 Web 服务。最近,我们注意到我们收到了来自 Web 服务的空响应(端点是我们不维护的第 3 方)。 我已经找到了我们的代码失败的地方并且它在我们的存根中。请参阅下面的代码,代码在两个 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);
        }
    }

【问题讨论】:

  • 你说那行代码“失败”了。它是如何失败的?有什么症状?
  • "Log message 1" 打印到日志中,但是"Log message 2" 没有打印到日志中。如果执行成功,则日志中应出现“日志消息 2”。日志中不会出现“日志消息 2”或异常消息。

标签: axis2


【解决方案1】:
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() 正在扔东西。

你说它没有抛出异常,但它可能会抛出 Error 或其他类型的 Throwable。通常不建议捕获非异常抛出,但您可以添加一些代码来临时执行此操作:

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

您可能会发现收到 OutOfMemoryErrorNoClassDefFoundError 是因为您的部署中缺少某些 jar。

【讨论】:

  • 宾果游戏!我通过添加您建议的异常检查发现了问题。我的类路径中有两个不同的 axiom-dom jar 文件!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多