Con Interceptors de CDI puedes hacerlo. Primero creas tu interceptor:
Código Java:
Ver original@InterceptorBingind
@Retention(RUNTIME)
@Target({FIELD, TYPE, METHOD, PARAMETER})
public @interface LoggingInterceptor { }
Código Java:
Ver original@Interceptor
@LoggingInterceptor
public class LoggingInterceptor {
@AroundInvoke
Message message = LoggerMessage.message;
// por ejemplo reemplazas letras por asteriscos
LoggerMessage.message = message.replaceAll("(?s).", "*");
}
}
Esta clase es el interceptor. El método con la anotación @AroundInvoke se ejecutará automáticamente cuando se detecte una llamada al método que intercepta.
El mensaje de log, debe estar en una clase para poderse interceptar:
Y aquí cómo la usuarias. Esta es una clase.
Código Java:
Ver originalString password
= "AxBj3xk92$//"; LoggerMessage.message = password; // hasta aquí vale 'AxBj3xk92$//'
this.log("La contraseña es: " + LoggerMessage);
...
// método que hace en log y es interceptado
@LoggingInterceptor
public void log
(String message
) { logger.log(message); // aquí ya vale '************'
}
Te servirá tanto si usas un servidor de aplicaciones o no. Si es una aplicación de escritorio, debes de agregar la librería weld (implementación de CDI) para poder hacer uso de los interceptores. Esto deberías hacerlo al principio de todo.
Código Java:
Ver original// inicia el contenedor CDI
Weld weld = new Weld();
WeldContainer container = weld.initalize();
Además, en el web.xml (debe estar dentro de META-INF), debe ir declarado el interceptor:
Código XML:
Ver original<interceptors>
<class>ruta.a.tu.paquete.LoggingInterceptor</class>
</interceptors>