Interceptor不会捕获EJBAccessException

时间:2018-05-13 17:05:34

标签: java-ee ejb wildfly

我使用的是Wildfly 12(EE 8)。

我试图捕获EJBAccessException以通过我的拦截器将其重新抛出为我自己的异常类型,但无济于事。我的Interceptor中的代码在抛出时根本不会被调用。虽然它确实有效并且确实可以捕获其他异常,所以我不确定是什么错。 EJB是否以某种方式无法识别我的拦截器#34;内部"问题,或者只有在调用Wildfly自己的AuthorizationInterceptor后才能调用它?

我的ejb-jar.xml:

<interceptors>
    <interceptor>
        <interceptor-class>myExceptionInterceptor</interceptor-class>
    </interceptor>
</interceptors>
<assembly-descriptor>
    <interceptor-binding>
        <ejb-name>*</ejb-name>
        <interceptor-class>myExceptionInterceptor</interceptor-class>
    </interceptor-binding>
</assembly-descriptor>

我的beans.xml为空,我也尝试将Interceptor声明放在那里,但没有效果。

我的拦截器:

@Throws
@Interceptor
@Priority(Interceptor.Priority.APPLICATION) // Tried playing with this too
public class myExceptionInterceptor implements Serializable {
    @AroundInvoke
    public Object check(InvocationContext invocationContext) throws Exception {
    try {
        return invocationContext.proceed();
    }
    catch (javax.ejb.EJBAccessException e) {
        //rethrow as own exception
    }

关于EJB安全性的standalone.xml的一部分:

<default-security-domain value="jaspitest"/>
<default-missing-method-permissions-deny-access value="true"/>

我的拦截器绑定:

@Inherited
@InterceptorBinding
@Retention(RetentionPolicy.RUNTIME)
@Target( {ElementType.METHOD, ElementType.TYPE} )
public @interface Throws {}

我正在调用它的示例bean:

@Stateless
public class UserService extends Service<User> {
   @RolesAllowed(Role.ADMIN)
   public void delete() {}
}

2 个答案:

答案 0 :(得分:0)

这不起作用,因为您的拦截器需要访问与其关联的业务方法相同的javax.ejb.EJBContext对象。请参阅EJB规范(3.2)的§4.7.2中的表2。

因此,在调用拦截器之前,将应用安全检查。

解决这个问题的唯一方法是将您的服务包装在不安全的外观中,并将拦截器应用于此。

答案 1 :(得分:0)

我认为可以使用容器拦截器解决此问题。 Container interceptors -将下一个xml放入jboss-ejb3.xml文件:

<jboss xmlns="http://www.jboss.com/xml/ns/javaee"
   xmlns:jee="http://java.sun.com/xml/ns/javaee"
   xmlns:ci ="urn:container-interceptors:1.0">

<jee:assembly-descriptor>
    <ci:container-interceptors>
        <jee:interceptor-binding>
            <ejb-name>*</ejb-name>
            <interceptor-class>YOUR FULLY QUALIFIED INTERCEPTOR CLASS GOES HERE</interceptor-class>
        </jee:interceptor-binding>            
    </ci:container-interceptors>
</jee:assembly-descriptor></jboss>
  • 将jboss-ejb3.xml复制到部署资源/ META-INF中。
  • 像链接的WildFly文档中的示例一样简单地创建拦截器

调用invocationContext.proceed()之后,您可以捕获EJBAccessException。