0

我有一个父子 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有完全的控制权,但是不能更改注解。

4

1 回答 1

0

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

所以我的解决方案是在我想要的特定方法上创建一个方法拦截器,然后将执行“重定向”到 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 之前调用的最后一个。唯一可能出错的方法是,如果有人在 EJB 上创建了一个方法拦截器,这将在执行中被跳过。但这在这个特定项目中不是问题。

于 2018-05-02T19:11:34.827 回答