2011-01-04 15 views

Respuesta

17

Añadir lo siguiente a sus puntos finales y clientes:

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

Esto guardara todo para el registro del servidor.

Si desea registrarlos en otro lugar, mire el código fuente del CXF LoggingInInterceptor y LoggingOutInterceptor. Puede seguir el patrón que utilizan para tomar los mensajes en su camino de entrada/salida y hacer con ellos lo que quiera.

añaden sus propios interceptores a la cadena con algo como esto:

<jaxws:inInterceptors> 
    <ref bean="myLoggingInInterceptor" /> 
</jaxws:inInterceptors> 
+0

¿Esta no sólo volcar el contenido sin formato es decir, no como XML? – irishguy

+0

Se mostrará XML en el registro del servidor. – BPS

+1

Para una función de registro más rica en características, ver https://github.com/greenbird/xml-formatter-components/tree/master/cxf – ThomasRS

26

tanto, he intentado un poco más con esto. Para obtener la solicitud XML y Respuestas conectado, y si está utilizando Log4J, es necesario configurar el registro de nivel de CXF en el log4j.xml archivo como esto (> = INFO):

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

Y la cxf.xml archivo debe contiene esto:

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

Ambos archivos deben estar en el CLASSPATH.

Para mostrar el mensaje de jabón agregar esto a su código:

Client client = ClientProxy.getClient(service); 
client.getInInterceptors().add(new LoggingInInterceptor()); 
client.getOutInterceptors().add(new LoggingOutInterceptor()); 
+0

Hay un par mayormente formas usadas para hacer el registro de CXF. Esta es la forma en la configuración de log4j ... que uno de arriba es la manera jaxws archivo de configuración –

18

La solicitud XML jabón puede ser conectado fácilmente por un encargo En interceptor. Por ejemplo, tenemos un interceptor llamado "wsLoggingInInterceptor", tanto en el archivo de contexto que será como el siguiente:

<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> 

En la clase podemos obtener la solicitud XML de la siguiente manera:

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 (); 
     } 

    } 

} 

Look , aquí también he registrado la dirección desde donde viene la solicitud. También puede obtener más información del objeto "HttpServletRequest". usted puede tener más de: http://cxf.apache.org/docs/interceptors.html

Para registro XML respuesta, puede echar un vistazo a this thread

2

Es mucho más fácil añadir su propio registrador a las propiedades de punto final. En este caso, el interceptor de registro predeterminado buscará su registrador en las propiedades de punto final y, si encuentra uno, lo usará; de lo contrario, creará el valor predeterminado.Aquí está mi ejemplo de uso:

<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> 
2

Si está utilizando la primavera Con que es de Java-configuración, hay 2 maneras fáciles de activar el registro de jabón-mensajes con Apache CXF:

  1. Directamente en el SpringBus - que es muy útil, si se desea registrar los mensajes de todos sus puntos finales 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. activar el registro por separado en la víspera ry expuesto CXF-Punto de llegada

    @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; }

Recuerde al LoggingFeature.setPrettyLogging (true); Método para ver bastante impresos de jabón Mensajes y LoggingFeature.initialize (springBus()); - sin esto último, la magia no sucede. Para código más limpio, también se puede separar la LoggingFeature como separado Bean y inyectarlo ya sea en su punto final o SpringBus-Bean.

Cuestiones relacionadas