繁体   English   中英

如何通过JAX-RS ExceptionMapper设置CDI拦截器的优先级

[英]How to priorize CDI Interceptor over JAX-RS ExceptionMapper

我有一个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..
    }

}

问题是,当抛出RuntimeException时(在启动事务之后),它立即被RuntimeExceptionMapper拦截,并且该事务永远不会回滚。

正是如此,我需要一种方法来确定TransactionRequiredInterceptor的优先级。

观察:不能使用@Transactional,因为我需要在Tomcat 8上进行部署。

恕我直言,你在问什么是没有道理的。 因为您的JAX-RS库不必通过拦截器实现异常映射。

但是您的TransactionRequiredInterceptor仍然可以通过使用finally块来响应该异常-因为JVM始终(几乎)保证其执行。

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

首先,更好的方法是具有附加层(我们称其为servicedao )并拦截此类方法。

其次,您可以100%确定您的事务管理实现将有大量错误。 在您的情况下(CDI和Tomcat),恕我直言,最好的方法是DeltaSpike,因为它已经为您提供了@Transactional拦截器: org.apache.deltaspike.jpa.api.transaction.Transactional 我个人非常成功地使用它。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM