Регистрация запроса / ответа с Apache CXF как XML - PullRequest
23 голосов
/ 04 января 2011

Можно ли зарегистрировать запрос / ответ как XML с использованием CXF, в идеале, в отдельный файл, чтобы я мог отслеживать, что делает приложение?

Ответы [ 5 ]

28 голосов
/ 16 марта 2011

Итак, я попробовал немного больше с этим.Для регистрации запросов и ответов XML, и если вы используете Log4J, вам нужно установить уровень журнала CXF в файле log4j.xml , например, (> = INFO):

<logger name="org.apache.cxf" >
    <level value="INFO" />
</logger>

И файл cxf.xml должен содержать следующее:

<cxf:bus>
    <cxf:features>
        <cxf:logging/>
    </cxf:features>
</cxf:bus> 

Оба файла должны быть в CLASSPATH.

Для отображения сообщения мыла добавьтеэто к вашему коду:

Client client = ClientProxy.getClient(service);
client.getInInterceptors().add(new LoggingInInterceptor());
client.getOutInterceptors().add(new LoggingOutInterceptor());
20 голосов
/ 08 мая 2012

Запрос мыла xml может быть легко зарегистрирован пользовательским In-перехватчиком. Скажем, у нас есть перехватчик с именем "wsLoggingInInterceptor", поэтому в файле контекста это будет выглядеть следующим образом:

<bean id="loggingInInterceptor" class="org.apache.cxf.interceptor.LoggingInInterceptor"/>
<bean id="logOutInterceptor" class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>
<bean id="wsLoggingInInterceptor" class="org.jinouts.webservice.logging.WSLoggingInInterceptor"/>


   <cxf:bus>
        <cxf:inInterceptors>
            <ref bean="loggingInInterceptor"/>
            <ref bean="wsLoggingInInterceptor"/>
        </cxf:inInterceptors>
        <cxf:outInterceptors>
            <ref bean="logOutInterceptor"/>            
       </cxf:outInterceptors>
    </cxf:bus>

В классе мы можем получить запрос xml следующим образом:

public class WSLoggingInInterceptor extends AbstractSoapInterceptor
{

    public WSLoggingInInterceptor ()
    {
        super(Phase.RECEIVE);
    }

    @Override
    public void handleMessage ( SoapMessage message ) throws Fault
    {
        //get the remote address
        HttpServletRequest httpRequest = (HttpServletRequest) message.get ( AbstractHTTPDestination.HTTP_REQUEST );
        System.out.println ("Request From the address : " + httpRequest.getRemoteAddr ( ) );

        try
        {
            // now get the request xml
            InputStream is = message.getContent ( InputStream.class );
            CachedOutputStream os = new CachedOutputStream ( );
            IOUtils.copy ( is, os );
            os.flush ( );
            message.setContent (  InputStream.class, os.getInputStream ( ) );
            is.close ( );

            System.out.println ("The request is: " + IOUtils.toString ( os.getInputStream ( ) ));
            os.close ( );
        }

        catch ( Exception ex )
        {
            ex.printStackTrace ( );
        }

    }

}

Смотри, здесь у меня также есть лог адрес, откуда приходит запрос. Вы также можете получить дополнительную информацию из объекта "HttpServletRequest". Вы можете получить больше от: http://cxf.apache.org/docs/interceptors.html

Для регистрации ответа xml вы можете посмотреть на эту тему

17 голосов
/ 06 января 2011

Добавьте следующее к своим конечным точкам и клиентам:

<jaxws:features>
    <bean class="org.apache.cxf.feature.LoggingFeature" />
</jaxws:features>

При этом все будет занесено в журнал сервера.

Если вы хотите записать их в другом месте, посмотрите на исходный код встроенного CXF LoggingInInterceptor и LoggingOutInterceptor. Вы можете следовать шаблону, который они используют, чтобы захватывать сообщения при входе и выходе и делать с ними то, что вам нравится.

Добавьте свои собственные перехватчики в цепочку примерно так:

<jaxws:inInterceptors>
    <ref bean="myLoggingInInterceptor" />
</jaxws:inInterceptors>
7 голосов
/ 13 августа 2015

Если вы используете Spring с его Java-конфигурацией, есть 2 простых способа активировать ведение журнала SOAP-сообщений с помощью Apache CXF:

  1. Непосредственно на SpringBus - это полезно, если вы хотите регистрировать сообщения всех ваших конечных точек CXF:

    @Bean(name=Bus.DEFAULT_BUS_ID) public SpringBus springBus() { SpringBus springBus = new SpringBus(); LoggingFeature logFeature = new LoggingFeature(); logFeature.setPrettyLogging(true); logFeature.initialize(springBus); springBus.getFeatures().add(logFeature); return springBus; }

  2. Активировать ведение журнала отдельно на каждой открытой конечной точке CXF

    @Bean public Endpoint endpoint() { EndpointImpl endpoint = new EndpointImpl(springBus(), weatherService()); endpoint.publish(SERVICE_NAME_URL_PATH); endpoint.setWsdlLocation("Weather1.0.wsdl"); LoggingFeature logFeature = new LoggingFeature(); logFeature.setPrettyLogging(true); logFeature.initialize(springBus()); endpoint.getFeatures().add(logFeature); return endpoint; }

Напомнить LoggingFeature.setPrettyLogging (true); Метод, чтобы увидеть красивые напечатанные SOAP-сообщения и LoggingFeature.initialize (springBus ()); - без последнего волшебства не бывает. Для более чистого кода вы также можете отделить LoggingFeature как отдельный компонент Bean и добавить его в свой SpringBus или Endpoint-компонент.

2 голосов
/ 31 июля 2013

Гораздо проще добавить собственный регистратор в свойства конечной точки.В этом случае перехватчик регистрации по умолчанию будет искать ваш регистратор в свойствах конечной точки, и если он найдет его, он будет использовать его, в противном случае он создаст значение по умолчанию.Вот мой пример использования:

<jaxws:endpoint
        xmlns:client="http://service.info.client.diasoft.services.stream.integration.cib.sberbank.ru"
        address="/diasoft/clientInfoWS"
        serviceName="client:ClientWS"
        implementor="#clientServiceImpl">
    <jaxws:properties>
        <entry key="MessageLogger" value-ref="logger"/>
    </jaxws:properties>
    <jaxws:features>
        <bean class="org.apache.cxf.feature.LoggingFeature"/>
    </jaxws:features>
</jaxws:endpoint>


<bean id="logger" class="org.apache.cxf.common.logging.LogUtils" factory-method="getLogger">
    <constructor-arg value="ru.sberbank.cib.integration.stream.services.diasoft.client.info.service.ClientWSImpl"/>
</bean>
...