6

假设我有一个定义两个视图的 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、Glassfish 3.x 和 TomEE 1.5.1)。

4

1 回答 1

0

就像 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.");
        }
    }
}

要访问这个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 中实现相同但找不到​​答案......

于 2013-09-19T21:34:39.527 回答