2

我们正在我们的数据库审计项目中实施 Envers,但遇到了障碍。我们不知道如何确定是哪个用户进行了更改。我能找到的所有示例都使用 Seam 及其 Component.getInstance 技术。

  • 玻璃鱼 3.1.2.2
  • 莫哈拉 2.1.13
  • 休眠 4.1.6.Final

这是我们的自定义修订实体

@Entity
@RevisionEntity(CustomRevisionListener.class)
public class CustomRevisionEntity {
    @Id
    @GeneratedValue
    @RevisionNumber
    private int id;

    private String login;

    getters/setters...
}

以及自定义修订侦听器

public class CustomRevisionListener implements RevisionListener {
    @Override
    public void newRevision(Object revisionEntity) {
        CustomRevisionEntity rev = (CustomRevisionEntity) revisionEntity;

        //how do we get the FacesContext/remote user?

        rev.setLogin("unknown");
    }
}

我们已经尝试过注入和作用域,但没有成功,我们还尝试了这个ClassLoader 解决方案,我发现似乎是类似的情况,但 getCurrentInstance() 仍然为空;

谢谢你的帮助!

4

1 回答 1

0

adamw 是正确的,FacesContext.getCurrentInstance() 确实在自定义 RevisionListener 中工作。

我们有一个 javax.servlet.Filter 实现试图在 doFilter() 方法中处理事务,无论出于何种原因导致 FacesContext.getCurrentInstance() 在 RevisionListener 中返回 null。我们昨天出于不同的原因从 web.xml 中删除了它,当我今天早上尝试不使用它的 getCurrentInstance() 时,一切正常。

感谢大家的回复,也许有一天这会对其他人有所帮助。

于 2013-01-31T16:02:20.890 回答