Pio*_*cki 6 ejb-jar.xml interceptor java-ee-6 ejb-3.1 sessioncontext
假设我有一个定义两个视图的EJB:
两个接口共享相同的方法签名,因此它类似于:
public interface MyBusinessCommon {
void myMethod(Object o);
}
@Local
public interface MyBusinessLocal extends MyBusinessCommon { }
@Remote
public interface MyBusinessRemote extends MyBusinessCommon { }
@Stateless
public class MyBusinessBean implements MyBusinessLocal, MyBusinessRemote {
public void myMethod(Object o) {
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法弄清楚EJB本身(或其拦截器?)内部调用的EJB视图?
假设我想根据使用的视图执行不同的授权程序.远程应该更加受限制,本地不应该.
我可以调用SessionContext#getInvokedBusinessInterface()但这只给了我关于类对象的信息 - 而不是关于它的EJB语义.明确地使用反射来检查接口或bean上的注释是否存在是不够的(在ejb-jar.xml?中定义的视图怎么样?)
我怀疑是否有可能使用直接的EJB规范,但也许我错过了一些东西.
如果没有,是否可以从应用程序服务器的内部获取此信息?(我们只考虑JBoss AS 7.x,Glassfish 3.x和TomEE 1.5.1).
正如 Arjan 所说 - 仅仅遵循 EJB 规范是不可能做到的。
然而,在 Glassfish 中,这很简单。
所有 EJB 拦截器都接受该InvocationContext参数。InvocationContextGlassfish 中的实现实际上是com.sun.ejb.EjbInvocation类。它有一个isLocal字段告诉您它是否正在拦截本地业务呼叫(或isRemote远程业务呼叫)。您可以使用它,例如:
import com.sun.ejb.EjbInvocation;
import javax.interceptor.AroundInvoke;
import javax.interceptor.Interceptor;
import javax.interceptor.InvocationContext;
@Interceptor
public class CallSourceAwareInterceptor {
@AroundInvoke
public Object aroundInvoke(InvocationContext ictx) throws Exception {
boolean isLocalCall = isLocalEJBCall(ictx);
return ictx.proceed();
}
boolean isLocalEJBCall(final InvocationContext ictx) {
if (ictx instanceof EjbInvocation) {
return ((EjbInvocation) ictx).isLocal;
}
else {
throw new IllegalArgumentException("Unknown InvocationContext implementation.");
}
}
}
Run Code Online (Sandbox Code Playgroud)
要访问这个EjbInvocation内部 Glassfish 类,您需要添加以下 Maven 依赖项:
<dependency>
<groupId>org.glassfish.main.ejb</groupId>
<artifactId>ejb-container</artifactId>
<version>4.0.1-b02</version>
<scope>provided</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)
您可能需要添加以下特定存储库才能访问此工件:
<repositories>
<repository>
<id>maven-promoted</id>
<url>https://maven.java.net/content/groups/promoted/</url>
</repository>
</repositories>
Run Code Online (Sandbox Code Playgroud)
我做了一个快速研究(基于理查德关于Invocation对象的建议)如何在 JBoss 中实现相同的目标,但找不到答案......
| 归档时间: |
|
| 查看次数: |
311 次 |
| 最近记录: |