Incorpora AOP en proyectos JEE con Interceptores.

Una buena costumbre en sistemas modernos es crear un logging o captura de rastreo de cada objeto o método que quisiéramos auditar.
EJB provee una versión mas simple que Spring en cuanto a AOP y lo minimiza en Interceptores.
En este ejemplo muy simple creamos una clase y dentro de ellas creamos el interceptor, el Logging y el objeto (mejor es persistirlo) para guardar cada intercepción:

public class AuditorInterceptor extends BaseDAO {

    private static final Logger logger = Logger.getLogger(AuditorInterceptor.class);

    @AroundInvoke
    Object audit(InvocationContext ctx) throws Exception {
        String target = ctx.getTarget().getClass().getSimpleName() + "." + ctx.getMethod().getName();
        Object[] params = ctx.getParameters();

        logger.debug("Logging action - customer id ==> ");
        StringBuilder sb = new StringBuilder();
        for (int i = 1; i < params.length; i++) {
            sb.append(params[i]);
            sb.append("\n");
        }
        AuditorModel auditEntry = new AuditorModel();

        auditEntry.setTarget(target);

        auditEntry.setFecha(new Date());

        auditEntry.setParametros(sb.toString());
        // em.persist(auditEntry); SOLO SI PERSISTE
        return ctx.proceed();
    }
}

Una vez configurado podemos hacer uso del mismo en cualquier EJB.
Podemos hacerlo a nivel de clase o método:

En un método:

  @Interceptors(AuditorInterceptor.class)
    public void create(Object ob) {
        em.persist(ob);
    }

En una clase:

  @Interceptors(AuditorInterceptor.class)
  class claseEJB { ... }</pre>

Y especificar los métodos que no queremos afectar:

@ExcludeClassInterceptors
public Cliente updateCliente(Cliente cliente) { ... }
Anuncios