我使用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引擎内的某处深处抛出一个类强制转换异常,并且只有当我碰巧记住这个症状时才能弄清楚出了什么问题。
在触发侦听器之前,我无法找到一种方法来要求接口或测试接口是否存在。
任何想法都会受到赞赏。
答案 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。