当前位置: 首页 > 面试题库 >

使用AXIS2创建的ADB存根在客户端获取原始XML SOAP响应

郜俊晤
2023-03-14
问题内容

我使用AXIS2创建的ADB存根访问SOAP服务。我想记录服务返回的任何Axis Fault的原始XML响应。我可以将这些错误捕获为“
ServiceError”。但是,我找不到找到原始XML的方法(请参见下面的示例)。

我找到了一种使用getOMElement访问原始XML请求/响应以进行常规处理的方法(请参见下面的示例)。但是,这不适用于故障。

如何使用ADB存根获取原始XML错误?

示例Java代码:

    public void testRequest(String URL) throws AxisFault {
        MyServiceStub myservice = new MyServiceStub(URL);
        MyRequest req = new MyRequest();
        try {
            TypeMyFunctionResponse response = myservice.myFunction(req);

            // logging full soap response
            System.out.println("SOAP Response: "
                    + response.getOMElement(null,
                            OMAbstractFactory.getOMFactory())
                            .toStringWithConsume());
        } catch (RemoteException e) {
            //...
        } catch (ServiceError e) {
            // how to get the raw xml?
        }
    }

我想获取并记录日志的故障响应示例:

<?xml version='1.0' encoding='UTF-8'?>
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
    <soapenv:Body>
        <soapenv:Fault>
            <soapenv:Code>
                <soapenv:Value>soapenv:Receiver</soapenv:Value>
            </soapenv:Code>
            <soapenv:Reason>
                <soapenv:Text xml:lang="en-US">service error</soapenv:Text>
            </soapenv:Reason>
            <soapenv:Detail>
                <ns1:error xmlns:ns1="http://www.somehost.com/webservices/someservice">
                    <ns1:code>500</ns1:code>
                    <ns1:messageText>some fault message</ns1:messageText>
                </ns1:error>
            </soapenv:Detail>
        </soapenv:Fault>
    </soapenv:Body>
</soapenv:Envelope>

问题答案:

按照joergl的建议,我使用“ SOAPHandler”将ADB存根更改为JAX-WS-
one,以按照以下说明记录请求,响应和错误:http ://www.mkyong.com/webservices/jax-ws/jax -ws-
soap-handler在客户端/

我的处理程序如下所示,用于使用log4j记录格式正确的XML:

public class RequestResponseHandler  implements SOAPHandler<SOAPMessageContext> {

    private static Logger log = Logger.getLogger(RequestResponseHandler.class);
    private Transformer transformer = null;
    private DocumentBuilderFactory docBuilderFactory = null;
    private DocumentBuilder docBuilder = null;

    public RequestResponseHandler() {
        try {
            transformer = TransformerFactory.newInstance().newTransformer();
            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
            transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "5");
            docBuilderFactory = DocumentBuilderFactory.newInstance();
            docBuilder = docBuilderFactory.newDocumentBuilder();
        } catch (TransformerConfigurationException
                | TransformerFactoryConfigurationError
                | ParserConfigurationException e) {
            log.error(e.getMessage(), e);
        }
    }

    @Override
    public void close(MessageContext arg0) {
    }

    @Override
    public boolean handleFault(SOAPMessageContext messageContext) {
        log(messageContext);
        return true;
    }

    @Override
    public boolean handleMessage(SOAPMessageContext messageContext) {
        log(messageContext);
        return true;
    }

    private void log(SOAPMessageContext messageContext) {
        String xml = "";
        SOAPMessage msg = messageContext.getMessage();
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        try {
            msg.writeTo(out);
            xml = out.toString("UTF-8");
        } catch (Exception e) {
            log.error(e.getMessage(),e);
        }

        String direction = "";
        Boolean outbound = (Boolean) messageContext.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); 
        if (outbound) { 
            direction += "Request: \n"; 
        } else { 
            direction += "Response: \n";
        }

        log.info(direction + getXMLprettyPrinted(xml));     
    }

    @Override
    public Set<QName> getHeaders() {
        return Collections.emptySet();
    }


    public String getXMLprettyPrinted(String xml) {

        if (transformer == null || docBuilder == null)
            return xml;

        InputSource ipXML = new InputSource(new StringReader(xml));
        Document doc;

        try {
            doc = docBuilder.parse(ipXML);
            StringWriter stringWriter = new StringWriter();
            StreamResult streamResult = new StreamResult(stringWriter);
            DOMSource domSource = new DOMSource(doc);
            transformer.transform(domSource, streamResult);
            return stringWriter.toString();
        } catch (SAXException | IOException | TransformerException e) {
            log.error(e.getMessage(), e);
            return xml;
        }
    }
}

另外,我想在应用程序代码中重用原始XML。因此,我不得不将此数据从SOAPHandler传输回我的客户端代码。如何做到这一点并不是太明显。



 类似资料:
  • 问题内容: 我试图从Web服务而不是通常的POJO集合中获取原始XML响应。 我正在使用从WSDL和某些模式生成的Web服务客户端(因此我可以访问该客户端的代码)。该客户端是在RAD 7.5中生成的,我认为是使用JAX- WS。我一直在研究客户端代码本身,但是我什至不确定客户端代码是否处理过原始XML或是否将其传递给其他库。 问题答案: 您可以使用 您可以使用方法简单地获取消息并将消息转换为Str

  • 问题内容: 我正在尝试创建一个Web服务,我的交易工具是: ** Axis2,Eclipse,Tomcat,Ant ** 我需要从Code创建一个Web服务,即编写一个基本的Java类,它将具有在WSDL中声明的方法。然后使用java2WSDL.sh创建我的WSDL。 因此,这种方法是否正确: 用实际的业务逻辑编写我的Java类 现在,当我将此Hello.java传递给java2WSDL.sh时,

  • 如何生成存根或创建此文件夹?

  • 问题内容: 我想记录一个axis2客户端发出的所有请求/响应。我试图在http://code.google.com/support/bin/answer.py?hl=zh_CN&answer=15137中创建一个称为describer 的文件,但没有成功(我没有日志文件)。 请求是通过https发出的,我不确定是否重要。我试过了 和 没有成功。 问题答案: 对于SOAP消息的Axis2客户端日志记

  • 我按照谷歌提供的留档使用API访问gmail。根据谷歌留档,我们需要访问令牌来管理gmail。 因此,我试图通过阅读下面给出的文档链接来创建一个访问令牌。 Link1:-developers.google.com/accounts/docs/OAuth2WebServer,基于此文档创建了URL1。 Link2:-code.google.com/p/google-mail-oauth2-tools

  • 只是想知道有没有办法得到spring Web-Flux的web客户端的响应时间?