按超类EJB名称查找EJB子类

时间:2018-04-30 17:17:24

标签: java jndi ejb-3.0 jboss-4.2.x deployment-descriptor

我有一个父和子EJB

Set<String> mySet = sharedPreferences.getStringSet(myKey, null);
for(String myString : mySet) {
    //do something with myString
}

由于我公司的架构原因,我无法更改MyCore项目。但它们都在同一个jar中打包并部署到JBOSS 4.2.3。

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

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

1 个答案:

答案 0 :(得分:0)

我想出了一个可以解决问题的方法。实际上,我并不需要重定向MyCustomizationEjb的所有调用。我只需要一个特定的方法(此时)。

所以我的解决方案是在我想要的特定方法上制作一个方法拦截器,然后重新定向&#34;像这样执行到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,那么在执行中会跳过它。但在这个特定的项目中,这不是问题。