org generate from example xml cxf webservice-client

xml - example - generate client from wsdl java cxf



Solicitud/respuesta de registro con Apache CXF como XML (5)

¿Es posible registrar la solicitud / respuesta como XML usando CXF, idealmente en un archivo separado para que pueda monitorear lo que está haciendo una aplicación?


Agregue lo siguiente a sus puntos finales y clientes:

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

Esto registrará todo en el registro del servidor.

Si desea iniciar sesión en otro lugar, mire el código fuente del CXF LoggingInInceptor y LoggingOutInterceptor incorporados. Puede seguir el patrón que usan para captar los mensajes en su camino de entrada / salida y hacer con ellos lo que quiera.

Agrega tus propios interceptores a la cadena con algo como esto:

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


Así que, probé un poco más con esto. Para obtener la solicitud XML y las respuestas registradas, y si está utilizando Log4J, debe establecer el nivel de registro de CXF en el archivo log4j.xml como este (> = INFO):

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

Y el archivo cxf.xml debería contener 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 agregue esto a su código:

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


Es mucho más fácil agregar su propio registrador a las propiedades de punto final. En este caso, el interceptor de registro predeterminado buscará su registrador en las propiedades del punto final y, si encuentra uno, lo utilizará 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>


La solicitud soap xml se puede registrar fácilmente mediante un interceptor In personalizado. Digamos que tenemos un interceptor llamado "wsLoggingInInceptor", por lo que en el archivo de contexto 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 el xml de solicitud 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 ( ); } } }

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

Para registrar la respuesta xml puede echar un vistazo a este hilo


Si está utilizando Spring con su configuración de Java, hay 2 formas fáciles de activar el registro de mensajes SOAP con Apache CXF:

  1. Directamente en el SpringBus, eso es útil, si 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. Active el registro por separado en cada punto extremo CXF expuesto

    @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 el LoggingFeature.setPrettyLogging (true); Método para ver mensajes SOAP y LoggingFeature.initialize (springBus ()) impresos bonitos; - Sin este último, la magia no sucede. Para un Código más limpio, también puede separar LoggingFeature como Bean separado e inyectarlo en su SpringBus o Endpoint-Bean.