通过超类 EJB 名称查找 EJB 子类

Lookup for EJB subclass by superclass EJB name

我有父子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 项目。但是它们都打包在同一个 jar 中并部署到 JBOSS 4.2.3.

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

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

我想出了一个方法来克服这个问题。实际上,我不需要重定向所有对 MyCustomizationEjb 的调用。我只是为了一个特定的方法(此时)需要它。

所以我的解决方案是在我想要的特定方法上创建一个方法拦截器,然后 "redirect" 像这样执行 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;
}

这样我现在可以透明地调用扩展的 specificMethod。

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

注意:不继续执行(使用ctx.proceed())没有问题,因为这个Interceptor是执行到达EJB之前调用的最后一个。它可能出错的唯一方法是如果有人创建 method interceptor at the EJB,这将在执行中被跳过。但这在这个特定项目中不是问题。