我有一个 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 ..
Obs:使用@Transactional 不是一个选项,因为我需要在Tomcat 8 上部署。