我有一个父和子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,但无法更改注释。
答案 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,那么在执行中会跳过它。但在这个特定的项目中,这不是问题。