找出所使用的EJB视图



假设我有一个定义了两个视图的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) {
        // ...
    }
}

是否有一种方法可以找出从EJB本身(或其拦截器)内部调用的EJB视图

假设我想根据使用的视图执行不同的授权过程。远程应该受到更多约束,而本地不应该。

我可以调用SessionContext#getInvokedBusinessInterface(),但这只给了我关于类对象的信息-而不是关于它的EJB语义。简单地使用反射来检查接口或bean上的注释是否存在是不够的(ejb-jar.xml中定义的视图呢?)

我怀疑直接使用EJB规范是可能的,但也许有什么我错过了。

如果没有,是否有可能从应用服务器的内部获取此信息?(让我们只考虑JBoss AS 7。x、玻璃鱼

就像Arjan说的那样,仅仅遵循EJB规范是不可能做到的。

然而,在Glassfish中,这很容易做到。

所有EJB拦截器接受InvocationContext参数。InvocationContext在Glassfish中的实现实际上是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.");
        }
    }
}

要访问这个EjbInvocation内部Glassfish类,你需要添加以下maven依赖项:

<dependency>
    <groupId>org.glassfish.main.ejb</groupId>
    <artifactId>ejb-container</artifactId>
    <version>4.0.1-b02</version>
    <scope>provided</scope>
</dependency>

并且您可能需要添加以下特定的存储库来访问该工件:

<repositories>
    <repository>
        <id>maven-promoted</id>
        <url>https://maven.java.net/content/groups/promoted/</url>
    </repository>
</repositories>

我做了一个快速的研究(基于理查德关于Invocation对象的建议)如何在JBoss中实现相同的,但找不到答案…

相关内容

  • 没有找到相关文章

最新更新