我使用的是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() {}
}
答案 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>
调用invocationContext.proceed()之后,您可以捕获EJBAccessException。