按超类 EJB 名称查找 EJB 子类



我有一个父级和子级EJB

@Stateless
@Local(MyCoreLocal.class)
@Remote(MyCore.class)
public class MyCoreEjb implements MyCoreLocal, MyCore {
...
}
@Stateless
@Local(MyCustomizationLocal.class)
@Remote(MyCustomization.class)
public class MyCustomizationEjb extends MyCoreEjb implements MyCustomizationLocal, MyCustomization{
...
}

由于我公司的建筑原因,我无法更改MyCore项目。但是两者都打包在同一个罐子里,并部署到 JBOSS 4.2.3 中。

问题是,每当有人调用MyCoreEjb时,我都必须使用MyCustomEjb。如何覆盖 MyCoreEjb 的 JNDI 条目以指向 MyCustomEjb,以便将 MyCoreEjb 的所有调用透明地重定向到 MyCustomizationEjb?

ps:我可以完全控制项目的 ejb-jar.xml,但不能更改注释。

我想出了一个可以克服这个问题的方法。实际上,我不需要重定向所有对MyCustomEjb的调用。我只需要一个特定的方法(目前(。

所以我的解决方案是在我想要的特定方法上创建一个方法拦截器,并将执行"重定向"到 MyCustomizationEjb,如下所示:

public class SpecificMethodInterceptor{
@EJB
MyCustomization myCustomization;
@AroundInvoke
public Object intercept(InvocationContext ctx) throws Exception {
Object result = myCustomization.specificMethod((Param1Type)ctx.getParameters()[0], (Param2Type) ctx.getParameters()[1]);
return result;
}

这样,我现在可以透明地调用扩展的特定方法。

我知道这不是最易于维护或可扩展的解决方案(因为我想要覆盖的每个方法都需要一个拦截器(,但考虑到这个特定的项目限制,我相信这是最好的选择。

注意:不继续执行(使用 ctx.proceed(((没有问题,因为此拦截器是在执行到达 EJB 之前调用的最后一个拦截器。它出错的唯一方法是,如果有人在 EJB 上制作了一个方法拦截器,这将在执行中被跳过。但在这个特定的项目中,这不是问题。

最新更新