En referencia al articulo anterior: Mostrar la entrada y salida en el log del Web Service con Apache CXF.
Ahora lo que quiero es grabarlo en la bbdd.
Apache CXF en su modulo cxf-rt-management tiene un paquete denominado: org.apache.cxf.management.persistence. Vamos utilizar esto, que ya esta casi hecho para grabar en nuestra bbdd.
En el paquete vemos las siguientes clases:
ExchangeData: es un bean que contiene toda la informacion sobre la peticion y la respuesta. ¡Ya podian haber implementado un toString para cuando debugeas!.
ExchangeDataDAO: la interfaz que se llama para persistir.
ExchangeDataFilter: la interfaz que se llama para saber si se puede persistir. Es un filtro.
ExchangeDataProperty: el bean para las propiedades de los mensajes de entrada-salida. Esta clase se utiliza en el bean ExchangeData.
FilesystemExchangeDataDAO: implementación de la interfaz del DAO que graba en un fichero. Si no se le indica la ruta, lo hace en una carpeta temporal. En mi caso, en la carpeta /temp de $CATALINA_HOME.
StatusExchangeDataFilter: implementación de la interfaz del filtro. Esta implementación es solo para errores.
¿Como se usa?
A) usando las clases que hemos visto.
Es decir, vamos a grabar a fichero en la carpeta /temp de $CATALINA_HOME, solo los mensajes que den error (excepciones) en nuestro Web Service.
En nuestro fichero de configuración de CXF (un aplicattionContext.xml de spring), ponemos lo siguiente:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:jaxws="http://cxf.apache.org/jaxws" xmlns:cxf="http://cxf.apache.org/core" xsi:schemaLocation=" http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.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-servlet.xml" /> <cxf:bus> <cxf:inInterceptors> <!-- logueamos entrada-salida y la persistimos --> <bean class="org.apache.cxf.interceptor.LoggingInInterceptor" /> <ref bean="persistInInterceptor" /> </cxf:inInterceptors> <cxf:inFaultInterceptors> <bean class="org.apache.cxf.interceptor.LoggingInInterceptor" /> <ref bean="persistInInterceptor" /> </cxf:inFaultInterceptors> <cxf:outInterceptors> <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor" /> <ref bean="persistOutInterceptor" /> </cxf:outInterceptors> <cxf:outFaultInterceptors> <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor" /> <ref bean="persistOutInterceptor" /> </cxf:outFaultInterceptors> </cxf:bus> <jaxws:endpoint id="busquedaService" implementor="#busqueda" address="/busqueda" /> <bean id="exchangeDAOImpl" class="org.apache.cxf.management.persistence.FilesystemExchangeDataDAO" /> <bean id="statusExchangeDataFilter" class="org.apache.cxf.management.persistence.StatusExchangeDataFilter" > <property name="statusFilter" value="ERROR" /> <!-- Registramos solo los errores, opcion por defecto que no hace falta poner --> <!-- <property name="statusFilter" value="OK" /> --> <!-- Tb podemos registrar los aciertos --> </bean> <bean id="persistInInterceptor" class="org.apache.cxf.management.interceptor.PersistInInterceptor" /> <bean id="persistOutInterceptor" class="org.apache.cxf.management.interceptor.PersistOutInterceptor"> <property name="exchangeDataDAO" ref="exchangeDAOImpl" /> <property name="exchangeDataFilter" ref="statusExchangeDataFilter" /> </bean> </beans>
b) Personalizando el dao y el filtro.
Exactamente lo anterior pero Con nuestra propia implementación de las interfaces.
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:jaxws="http://cxf.apache.org/jaxws" xmlns:cxf="http://cxf.apache.org/core" xsi:schemaLocation=" http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.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-servlet.xml" /> <cxf:bus> <cxf:inInterceptors> <!-- logueamos entrada-salida y la persistimos --> <bean class="org.apache.cxf.interceptor.LoggingInInterceptor" /> <ref bean="persistInInterceptor" /> </cxf:inInterceptors> <cxf:inFaultInterceptors> <bean class="org.apache.cxf.interceptor.LoggingInInterceptor" /> <ref bean="persistInInterceptor" /> </cxf:inFaultInterceptors> <cxf:outInterceptors> <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor" /> <ref bean="persistOutInterceptor" /> </cxf:outInterceptors> <cxf:outFaultInterceptors> <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor" /> <ref bean="persistOutInterceptor" /> </cxf:outFaultInterceptors> </cxf:bus> <jaxws:endpoint id="busquedaService" implementor="#busqueda" address="/busqueda" /> <bean id="exchangeDAOImpl" class="mi.paquete.cxf.interceptor.persistence.PersistExchangeDataDAO" /> <bean id="exchangeDataFilter" class="mi.paquete.cxf.interceptor.persistence.NoFiltroNada" /> <bean id="persistInInterceptor" class="org.apache.cxf.management.interceptor.PersistInInterceptor" /> <bean id="persistOutInterceptor" class="org.apache.cxf.management.interceptor.PersistOutInterceptor"> <property name="exchangeDataDAO" ref="exchangeDAOImpl" /> <property name="exchangeDataFilter" ref="exchangeDataFilter" /> </bean> </beans>
El filtro, el cual queremos que no filtre nada, que persista siempre:
package mi.paquete.cxf.interceptor.persistence; import org.apache.cxf.management.persistence.ExchangeData; import org.apache.cxf.management.persistence.ExchangeDataFilter; public class NoFiltroNada implements ExchangeDataFilter { public boolean shouldPersist(ExchangeData data) { if(data == null){ return false; }else{ return true; } } }
Nuestra implementación de como vamos a graba en la base de datos:
package mi.paquete.cxf.interceptor.persistence; import org.apache.cxf.management.persistence.ExchangeData; import org.apache.cxf.management.persistence.ExchangeDataDAO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import mi.paquete.cxf.interceptor.persistence.AuditoriaWsDao ; public class ExchangeDataDaoImpl implements ExchangeDataDAO{ @Autowired @Qualifier("auditoriaWsDao") private AuditoriaWsDao auditDao; public void save(ExchangeData exchangeData) throws Exception { if(exchangeData == null) return; /* * GUARDAR: * ( * --descripcion del servicio-- * NombreDelServicio, NombreDeLaOperacionLLamada, * --descripcion de la peticion-- * fechaPeticion, xmlPeticion, tipoDePeticion, pilaError, * --descripcion de la respuesta-- * fechaRespuesta, xmlRespuesta, tipoDeRespuesta, pilaError, * ) */ auditDao.save(exchangeData.getUri(), exchangeData.getOperation(), exchangeData.getInDate(), exchangeData.getRequest(), AuditDao.REQUEST, null, exchangeData.getOutDate(), exchangeData.getResponse(), AuditDao.RESPONSE, exchangeData.getStackTrace()); } }
la implementación del DAO, de la configurarión de la bbdd, de Hibernate, de Spring Transacctional, etc. no corresponden a este articulo.