如何使JPA EntityListeners验证接口的存在

时间:2011-09-14 11:42:52

标签: jpa entitylisteners

我使用JPA在J2EE 5中工作,我有一个可行的解决方案,但我正在寻找清理结构。

我在我持久存在的一些JPA对象上使用EntityListeners,监听器相当通用但依赖于实现接口的bean,如果你记得添加接口,这种方法很有用。

我无法确定将EntityListener和Interface绑定在一起的方法,这样我就会得到一个导致正确方向的异常,甚至更好的编译时错误。

@Entity
@EntityListener({CreateByListener.class})
public class Note implements CreatorInterface{
    private String message;....
    private String creator;
    ....
}

public interface CreatorInterface{
    public void setCreator(String creator);
}

public class CreateByListener {
    @PrePersist
    public void dataPersist(CreatorInterface data){
        SUser user = LoginModule.getUser();
        data.setCreator(user.getName());
    }
}

这完全按照我想要的方式运行,除非创建新类并且它使用CreateByListener但未实现CreatorInterface。 当发生这种情况时,会在JPA引擎内的某处深处抛出一个类强制转换异常,并且只有当我碰巧记住这个症状时才能弄清楚出了什么问题。

在触发侦听器之前,我无法找到一种方法来要求接口或测试接口是否存在。

任何想法都会受到赞赏。

1 个答案:

答案 0 :(得分:2)

@PrePersist
public void dataPersist(Object data){
    if (!(data instanceof CreatorInterface)) {
        throw new IllegalArgumentException("The class " 
                                           + data.getClass() 
                                           + " should implement CreatorInterface");
    }
    CreatorInterface creatorInterface = (CreatorInterface) data;
    SUser user = LoginModule.getUser();
    creatorInterface.setCreator(user.getName());
}

这与你正在做的事情基本相同,但至少你会有一个更可读的错误信息,表明错误,而不是ClassCastException。