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

将肥皂原始请求/响应附加到stringbuilder或日志文件

顾昌翰
2023-03-14

我使用apache cxf编写了一个示例soap服务项目,并在此应用程序中使用log4j with进行日志记录。我可以将soap原始请求和响应记录到服务器控制台,但无法将其记录到日志文件或stingBuilder。和我的cxf bean。像这样的xml

**

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:cxf="http://cxf.apache.org/core"
    xmlns:jaxws="http://cxf.apache.org/jaxws" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
    <import resource="classpath:META-INF/cxf/cxf.xml" />
    <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
    <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
    <jaxws:endpoint xmlns:tns="http://source.sprint.com/"
        id="accountinfoservice" implementor="com.sprint.source.AccountInfoServiceImpl"
        wsdlLocation="wsdl/accountinfoserviceimpl.wsdl" endpointName="tns:AccountInfoServiceImplPort"
        serviceName="tns:AccountInfoServiceImplService" address="/AccountInfoServiceImplPort">
        <jaxws:features>
            <bean class="org.apache.cxf.feature.LoggingFeature" />
        </jaxws:features>
    </jaxws:endpoint>


</beans>**

客户端类

AccountInfoServiceImplService service= new AccountInfoServiceImplService();
    com.sprint.stubs.AccountInfoService op=service.getAccountInfoServiceImplPort();
    //System.out.println(op.getAccountInfo("123").getSuspendInd());

    logger.info("hello");

        Client client = ClientProxy.getClient(op);
        client.getInInterceptors().add(new LoggingInInterceptor());
        client.getOutInterceptors().add(new LoggingOutInterceptor());
        logger.info("response  "+client.getInInterceptors().add(new LoggingInInterceptor()));
        logger.info("request   "+client.getInInterceptors().add(new LoggingInInterceptor()));
        System.out.println(op.getAccountInfo("123").getFirstName());

记录器。信息(“请求”客户端。getInInterceptors()。添加(new LoggingInInterceptor());这段代码在日志文件中记录为true。如果我使用此配置文件和客户端java类,我可以将原始请求和响应记录到控制台,但我无法创建日志文件,那么我会搜索。。我这样更改了配置文件

    <bean id="abstractLoggingInterceptor" class="org.apache.cxf.interceptor.AbstractLoggingInterceptor" abstract="true" />
    <bean id="loggingInInterceptor" class="org.apache.cxf.interceptor.LoggingInInterceptor" parent="abstractLoggingInterceptor" />
    <bean id="loggingOutInterceptor" class="org.apache.cxf.interceptor.LoggingOutInterceptor" parent="abstractLoggingInterceptor" />

    <cxf:bus>
        <cxf:inInterceptors>
            <ref bean="loggingInInterceptor" />
        </cxf:inInterceptors>
        <cxf:outInterceptors>
            <ref bean="loggingOutInterceptor" />
        </cxf:outInterceptors>
        <cxf:outFaultInterceptors>
            <ref bean="loggingOutInterceptor" />
        </cxf:outFaultInterceptors>
        <cxf:inFaultInterceptors>
            <ref bean="loggingInInterceptor" />
        </cxf:inFaultInterceptors>
    </cxf:bus>
    <jaxws:endpoint xmlns:tns="http://source.sprint.com/"
        id="accountinfoservice" implementor="com.sprint.source.AccountInfoServiceImpl"
        wsdlLocation="wsdl/accountinfoserviceimpl.wsdl" endpointName="tns:AccountInfoServiceImplPort"
        serviceName="tns:AccountInfoServiceImplService" address="/AccountInfoServiceImplPort">
        <jaxws:features>
            <bean class="org.apache.cxf.feature.LoggingFeature" />
        </jaxws:features>
    </jaxws:endpoint>
</beans>

更改配置文件后,我得到了"org.apache.cxf.interceptor.故障:无法发送消息。在org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handle消息(MessageSenderInterceptor.java:64)"

我在网上搜索这个解决方案,但我做不到?有人能帮我解决这个问题吗

共有1个答案

越飞语
2023-03-14

使用org.slf4j: slf4j-log4j12代替依赖项中的log4j: log4j,检查log4j.xml中的记录器级别:

<logger name="org.apache.cxf">
    <level value="info"/>
</logger>
 类似资料:
  • 我想使用 wsdl 文件从 Camel 调用第三方网络服务,而无需生成任何客户端代码(因为我认为如果我提供 wsdl 文件,那么 Camel 能够生成我们之前生成的客户端,并且在我们的旧代码中工作) 经过长时间的搜索,我找到了一些帮助我实现目标的代码 代码为 这工作正常,但这里我是手动生成soap信封 wsdl文件是 现在我想生成肥皂请求,而不是静态的 请帮助我 先谢谢了

  • 问题内容: 我想记录来自某个特定端点的所有传入请求和响应,并进行内容过滤。即当我有这样的要求时: 我想过滤它,以便它看起来像这样的日志 或完全删除了m:Photo元素。 我发现CXF有一些LoggingInInterceptor和LoggingOutInterceptor,我可以编写自己的拦截器来做到这一点。但是,这需要做一些工作,所以我的问题是:您知道什么更好的即用型解决方案吗? 问题答案: 我

  • 如果有人能分享他解决以下问题的经验,我将不胜感激。我在JDK实现中有一个SOAP服务(我相信这就是Metro)。 出于日志记录的目的,我们需要提取传入请求和生成响应的正文。我试图通过在服务器端实现SOAPHandler来获取它。我将处理程序配置为Spring bean。我找到的所有示例基本上都复制了Oracle留档:https://docs.oracle.com/cd/E23943_01/web.

  • 第一特征给定ur“” def有效负载=read(") 请求有效载荷 肥皂行动" 值= /Envelope/Body/Response/Result/Num print value#按预期正确打印值 second.feature背景:*def fetch=read('first.feature')*def data=call fetch 情景: 打印数据。response#以json格式打印soap

  • SOAP请求有一个服务endpoint和一个xsd文件。但是,没有wsdl文件。我如何从这里手动生成soap请求(作为字符串的xml请求)并将其发送到服务endpoint? 我在SO上找到了类似的答案。但这是针对C#和. NET的,任何针对Java的想法都会受到高度赞赏。

  • 我正在使用改造2.x,我想记录请求和响应的标头和正文。 这是我正在做的,我的问题是请求的标题没有被记录在Android Monitor中,但其余的一切都被记录了。 Gradle版本 使用RC1和3.0.1由于错误问题报告错误链接