当前位置: 首页 > 知识库问答 >
问题:

CXF故障侦听器-记录soap故障消息,如soap客户端中所示

亢胤运
2023-03-14

我正在使用apache CXF(Spring启动)来开发我的肥皂服务器。在这里,我需要在我的肥皂故障拦截器中记录故障消息,就像在任何肥皂客户端中显示的那样(例如:肥皂UI)。我如何在我的故障拦截器中记录相同的输出?现在它只是显示异常详细信息

输入

<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
    <Body>
        <sayHello xmlns="http://service.sample.com/">
            <GreetingsRequest xmlns="">test</GreetingsRequest>
        </sayHello>
    </Body>
</Envelope>

输出(在肥皂客户端中显示)

UserNotfindException是代码中抛出的自定义异常

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body>
        <soap:Fault>
            <faultcode>soap:Server</faultcode>
            <faultstring>Fault occurred while processing.</faultstring>
            <detail>
                <ns1:UserNotFoundException xmlns:ns1="http://service.sample.com/">
                    <user xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns2="http://service.sample.com/" xsi:type="ns2:user">
                        <userId>U-123</userId>
                        <username>TestUser</username>
                    </user>
                </ns1:UserNotFoundException>
            </detail>
        </soap:Fault>
    </soap:Body>
</soap:Envelope>

我的定制拦截器代码

import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.Phase;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class CustomSoapFaultInterceptor extends AbstractSoapInterceptor{
    private static final Logger logger = LoggerFactory.getLogger(CustomSoapFaultInterceptor.class);
    public CustomSoapFaultInterceptor() {
        super(Phase.PRE_STREAM);
    }
    @Override
    public void handleMessage(SoapMessage soapMessage) throws Fault {
        Fault fault = (Fault) soapMessage.getContent(Exception.class);
        Throwable faultCause = fault.getCause();
        String faultMessage = fault.toString();
        logger.error("Test Error",fault);
    }
}

共有1个答案

罗安和
2023-03-14

您可以使用集成的日志记录设施:https://cxf.apache.org/docs/message-logging.html

如果您需要扩展代码,可以在GitHub上使用该代码:https://github.com/apache/cxf/blob/master/rt/features/logging/src/main/java/org/apache/cxf/ext/logging/LoggingFeature.java

 类似资料:
  • 我使用camel和cxf组件从Web服务中获取一些数据。在某些情况下,Web服务返回标准的soap:fault。我有下一个步骤: 阅读cxf和camel邮件列表中的类似问题,我理解cxfendpoint应该抛出异常,如果有soap foalt,org.apache.cxf.binding.soap.soapfault类型的异常,但我不能得到它。onException子句的目标是处理soap错误异常

  • 我试图读取来自CXF拦截器的SOAP错误消息,但我无法提取,我捕获了来自Fidler的响应 以下是菲德勒的回应 以下是我的代码 向客户端添加了FaultInterceptor

  • 我对SOAP相当陌生,我正在尝试理解SOAP错误处理(在Java中)。我已经读过关于这个话题的书,但仍然有一些概念对我来说还不清楚。 更具体地说,如何使用Eclipse WSDL编辑器处理各种响应代码。我已经使用Eclipse WSDL编辑器创建了我的WSDL,但是我愿意使用另一个工具(如SoapUI)来完成这一任务(处理错误)。 我已经附上了一个简单web服务的图像,它应该接受UserID(请求

  • 目前,这就是我如何捕捉异常并设置有效负载的方法 但是,CXF SOAP组件设置实际响应对象的有效负载。而我想在SOAP错误中发送一个错误对象。我怎么能那样做? 默认异常策略发送带有错误消息的SOAP错误。最初,我的目的只是添加记录器,让缺省错误消息在SOAP错误中运行。我添加了Catch exception策略,但后来发现它不会发送SOAP错误。然后我使用回滚策略发送SOAP错误。但是,使用Mul

  • 根据AWS文件: worker使用Java ExecutorService任务调用记录处理器方法。如果任务失败,工作进程将保留对记录处理器正在处理的碎片的控制。工作进程启动一个新的记录处理器任务来处理该碎片。有关详细信息,请参阅阅读节流。 根据AWS文件的另一页: Kinesis客户端库(KCL)依靠您的进程记录代码来处理处理数据记录时出现的任何异常。从进程记录抛出的任何异常都被KCL吸收。为了避

  • 我在一个独立的java应用程序中使用apache cxf client 3.2.2来调用一些soap Web服务。 试图在单向操作中获取soap故障代码和故障字符串,但没有成功。 我定义了一个自定义拦截器,但它永远不会到达handleMessage 定制拦截器的代码 } 我遇到的异常是MessageSenderEndingInterceptor(处于PREPARE\u SEND阶段)。 它正在抛出