2008-08-18 11 views
4

可能であれば、EJB 3セッションBeanメソッドを汎用引数でオーバーライドする方法はありますか?

次のEJB 3インタフェース/クラスがあるとします。

public interface Repository<E> 
{ 
    public void delete(E entity); 
} 

public abstract class AbstractRepository<E> implements Repository<E> 
{ 
    public void delete(E entity){ 
     //... 
    } 
} 

public interface FooRepository<Foo> 
{ 
    //other methods 
} 

@Local(FooRepository.class) 
@Stateless 
public class FooRepositoryImpl extends 
    AbstractRepository<Foo> implements FooRepository 
{ 
    @Override 
    public void delete(Foo entity){ 
     //do something before deleting the entity 
     super.delete(entity); 
    } 
    //other methods 
} 

次にFooRepository Beanにアクセスするもう1つのBean:

//... 
@EJB 
private FooRepository fooRepository; 

public void someMethod(Foo foo) 
{ 
    fooRepository.delete(foo); 
} 
//... 

ただし、 FooRepository beanが呼び出されます。代わりに、AbstractRepositoryで定義されているdeleteメソッドの実装のみが実行されます。

何が間違っているのですか、それともジェネリックと継承がうまくいっていないJava/EJB 3の制限ですか?

+0

今日は、コード行を変更することなく機能しました。他の何かがランタイム環境、デバッガなどで間違っているはずです... あなたの答えをありがとう! –

答えて

2

pojoで試してみるとうまくいくようです。あなたのコードを少し修正しなければならなかった。 あなたのインターフェースはちょっと分かりませんが、わかりません。

私は "Foo"は具体的なタイプだと思っていましたが、そうでない場合は、さらにテストをすることができます。

これをテストするための主要な方法を書いたばかりです。 私はこれが助けてくれることを願っています!

public static void main(String[] args){ 
     FooRepository fooRepository = new FooRepositoryImpl(); 
     fooRepository.delete(new Foo("Bar")); 
} 

public class Foo 
{ 
    private String value; 

    public Foo(String inValue){ 
     super(); 
     value = inValue; 
    } 
    public String toString(){ 
     return value; 
    } 
} 

public interface Repository<E> 
{ 
    public void delete(E entity); 
} 

public interface FooRepository extends Repository<Foo> 
{ 
    //other methods 
} 

public class AbstractRespository<E> implements Repository<E> 
{ 
    public void delete(E entity){ 
     System.out.println("Delete-" + entity.toString()); 
    } 
} 

public class FooRepositoryImpl extends AbstractRespository<Foo> implements FooRepository 
{ 
    @Override 
     public void delete(Foo entity){ 
      //do something before deleting the entity 
      System.out.println("something before"); 
      super.delete(entity); 
     } 
} 
1

あなたのFooRepositoryクラスに対して単なるPOJOとして単体テストを書くことができますか?それが期待どおりに機能する場合、私はそれがコンテナ内で異なって機能する何らかの理由に慣れていない。

私は何か他のことが起こっていると思うし、POJOとしてテストするとデバッグが容易になるでしょう。

関連する問題