gpt4 book ai didi

java - 如何优先考虑 CDI 拦截器而不是 JAX-RS ExceptionMapper

转载 作者:行者123 更新时间:2023-12-02 04:09:15 25 4
gpt4 key购买 nike

我有一个 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 block 来响应异常 - 因为 JVM 总是(几乎)保证其执行。

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

首先,一个更好的方法是添加额外的层(我们称之为 servicedao)并拦截此类方法。

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

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

关于java - 如何优先考虑 CDI 拦截器而不是 JAX-RS ExceptionMapper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33957632/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com