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.