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);
}
//...

FooRepository但是,当调用 bean的 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

您能否仅将其用作 POJO 来针对您的 FooRepository 类编写单元测试。如果它按预期工作,那么我不熟悉它在容器内的功能会有所不同的任何原因。

我怀疑还有其他事情发生,如果您将它作为 POJO 进行测试,它可能会更容易调试。

于 2008-08-18T17:04:42.927 回答