Java 如何使CDI拦截器优先于JAX-RS ExceptionMapper

Java 如何使CDI拦截器优先于JAX-RS ExceptionMapper,java,jax-rs,cdi,interceptor,exceptionmapper,Java,Jax Rs,Cdi,Interceptor,Exceptionmapper,我有一个REST Web服务,它使用以下方法管理其事务: @Inherited @InterceptorBinding @Retention(RetentionPolicy.RUNTIME) @Target({METHOD, TYPE, FIELD, PARAMETER}) public @interface TransactionRequired { } @Interceptor @TransactionRequired public class TransactionRequiredIn

我有一个REST Web服务,它使用以下方法管理其事务:

@Inherited
@InterceptorBinding
@Retention(RetentionPolicy.RUNTIME)
@Target({METHOD, TYPE, FIELD, PARAMETER})
public @interface TransactionRequired {

}

@Interceptor
@TransactionRequired
public class TransactionRequiredInterceptor {

    @Inject
    private EntityManager entityManager;

    @AroundInvoke
    public Object manageTransaction(InvocationContext ctx) {
        try { 
            ..start transaction..
        }
        catch(Exception e) { 
            ..rollback.. 
        }
    }
}
我也在映射我的异常,如下所示:

@Provider
public class RuntimeExceptionMapper implements ExceptionMapper<RuntimeException> {

    @Override
    public Response toResponse(RuntimeException exception) {
        .. return some response..
    }

}
@Provider
公共类RuntimeExceptionMapper实现ExceptionMapper{
@凌驾
响应的公共响应(运行时异常){
……回复。。
}
}
问题是,如果抛出RuntimeException(在事务启动后),它会立即被RuntimeExceptionMapper截获,并且事务永远不会回滚

既然如此,我需要一种方法来优先处理事务要求interceptor


Obs:使用@Transactional不是一个选项,因为我需要在Tomcat 8上部署。

我想你问的没有意义。因为您的JAX-RS库不必通过拦截器实现异常映射

但是您的
TransactionRequiredInterceptor
仍然可以使用
finally
块来响应异常,因为JVM总是(几乎)保证其执行

无论如何,我怀疑这是否是个好主意

首先,一个更好的方法是使用额外的层(我们称之为
service
dao
)并拦截此类类方法

其次,您可以100%确定事务管理的实现将有过多的bug。在您的情况下(CDI和Tomcat),最好的方法是因为它已经为您提供了这样的
@Transactional
拦截器:
org.apache.deltaspike.jpa.api.transaction.Transactional
。我亲自使用它,取得了巨大成功


顺便说一句:您还可以尝试Apache DeltaSpike,因为它还有许多其他有用的功能—它们可以帮您省去很多麻烦。

听起来您好像在拦截整个资源方法。我猜您正在资源方法中调用EM。为什么不添加DAO层并拦截DAO调用。谢谢,这对我有帮助:)此外,CDI已经为您提供了
@Transactional
拦截器this@maress没有
@javax.transaction.Transactional
只是一个注释。CDI本身不向您提供任何处理此注释的拦截器-因此它将被静默跳过:-)
@Transactional
仅当类路径上存在EJB3事务时(例如,在Java EE服务器中)才会考虑到。