如何使用通用参数覆盖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访问FooRepository
bean:
//... @EJB private FooRepository fooRepository; public void someMethod(Foo foo) { fooRepository.delete(foo); } //...
但是,当调用FooRepository
bean的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); } }