Alguma idéia de como eu posso estar utilizando o @Intercepts do vraptor para estar fazendo um log de auditoria?
O log teria as informações, do valor antigo do parametro, o valor alterado, data de alteração e usuario que alterou.
Sugestões?, Dicas?
Alguma idéia de como eu posso estar utilizando o @Intercepts do vraptor para estar fazendo um log de auditoria?
O log teria as informações, do valor antigo do parametro, o valor alterado, data de alteração e usuario que alterou.
Sugestões?, Dicas?
Você usa hibernate? Se sim você nunca conseguirá isso no vraptor.
Se você tem um objeto X que você alterou, e se você quiser tentar buscar o objeto antigo a menos que você pegue uma stateless-session você sempre pegará o valor corrente do pojo já alterado. Sendo assim eles serão sempre iguais.
A melhor solução, que é a que eu uso em um grande projeto que tenho e que precisa de uma minusciosa auditoria é usar o hibernate envers, que se não me engano já está vindo no core do hibernate (antigamente era um projeto da jboss).
Faça uma pesquisa sobre ele. É bem simples de configurar bastando apenas adicionar os listeners. Ele mesmo cria as tabelas de audit e faz todo esse controle. No caso desse meu sistema implementei uma forma de você comprar cada versão do registro, fazer merge ou rollback de versões.
Oi Davi!
Voce pode usar o hibernate (o plugin envers) como o Garcia sugeriu, se voce esta se importando com o conteudo de linhas do banco.
Caso queira auditar acessos a URLs, pode fazer algo que logue o usuario, o ip, e parametros caso voce precise.:
@Intercepts
public class AuditoriaInterceptor implements Interceptor {
private static final Logger LOG = Logger.getLogger(AuditoriaInterceptor.class);
private final UserInfo info;
private final HttpServletRequest request;
public AuditoriaInterceptor(UserInfo info, HttpServletRequest request) {
this.info = info;
this.request = request;
}
@Override
public boolean accepts(ResourceMethod method) {
return method.containsAnnotation(Audit.class);
}
@Override
public void intercept(InterceptorStack stack, ResourceMethod method, Object object) throws InterceptionException {
LOG.info(method.toString());
LOG.info("usuário: " + info.getUser());
LOG.info("ip: " + request.getRemoteAddr() + " " + request.getRemoteHost()+
" from " + request.getHeader( "X_FORWARDED_FOR" ));
Audit audit = method.getMethod().getAnnotation(Audit.class);
for (String value : audit.value()) {
LOG.info(value + "->" + request.getParameter(value));
}
LOG.info("");
stack.next(method, object);
}
}
Depois basta criar essa anotacoes e anotar com @Audit as classes que voce queria que sejam logadas por esse log:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Audit {
String[] value() default {};
}
Obrigado pela dica pessoal, estou usando hibernate, e vou dar uma estudada no Envers, qualquer duvida volto aqui.