6

次の 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
}

そして、Bean にアクセスする別のFooRepositoryBean :

//...
@EJB
private FooRepository fooRepository;

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

ただし、FooRepositoryBean の delete メソッドが呼び出されたときにオーバーライド メソッドが実行されることはありません。代わりに、で定義されている削除メソッドの実装のみAbstractRepositoryが実行されます。

私は何を間違っていますか、それともジェネリックと継承がまだうまく連携していないというのは、単に Java/EJB 3 の制限ですか?

4

2 に答える 2

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);
       }
}
于 2008-08-18T21:51:55.140 に答える
1

FooRepositoryクラスをPOJOとして使用するだけで、単体テストを作成できますか?それが期待どおりに機能する場合、コンテナ内で機能が異なる理由はよくわかりません。

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

于 2008-08-18T17:04:42.927 に答える