2011-09-14 4 views
2

JPAを使用してJ2EE 5で作業していますが、実際のソリューションがありますが、構造を整理することを検討しています。JPA EntityListenersでインターフェイスの存在を確認する方法

私は永続化しているJPAオブジェクトの一部でEntityListenersを使用していますが、リスナーはかなり一般的ですが、インターフェイスを実装するBeanに依存しています。

EntityListenerとInterfaceを結びつける方法を決定できないため、正しい方向に進み、さらにはコンパイル時にエラーが発生するという例外が発生します。私は新しいクラスが作成され、それがCreateByListenerを使用していますが、CreatorInterfaceを実装していないされている場合を除き、それがしたい

@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()); 
    } 
} 

この機能正確な方法。 JPAエンジンの深いところからクラスキャスト例外がスローされ、この現象を覚えてしまった場合にのみ、何がうまくいかなかったかを把握することができます。

私は、リスナーが起動する前にインターフェイスの存在やテストを行う方法を考え出すことができませんでした。

すべてのアイデアをいただければ幸いです。

答えて

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で、間違っているものを示すより読みやすいエラーメッセージを持っています。

関連する問題