如何使用通用参数覆盖EJB 3会话bean方法-如果可能的话?

时间:2020-03-05 18:40:25  来源:igfitidea点击:

假设我们具有以下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中定义的delete方法的实现。

我在做什么错,还是泛型和继承不能很好地结合使用,仅仅是Java / EJB 3的局限性?

解决方案

回答

我们可以仅将它用作POJO来针对FooRepository类编写单元测试吗?如果可以按预期工作,那么我不熟悉为什么它在容器内的功能有所不同。

我怀疑还有其他事情在进行,如果我们将其作为POJO进行测试,则调试起来可能会更容易。

回答

我用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);
       }
}