如果我有一个带有@ApplicationException的异常(inherited = true,rollback = true)但我希望子类不回滚。我可以使用@ApplciationException(rollback = false)注释子类吗?或者那不起作用?该规范似乎没有说,我能找到。
答案 0 :(得分:4)
JSR 220未明确说明此方案中应发生的情况。它确实指定application-exception
部署描述符元素将覆盖特定EJB的任何带注释的值:
应用程序异常不会自动导致标记 用于回滚的事务,除非ApplicationException注释是 应用于异常类,并指定回滚 元素值true或应用程序异常部署描述符 异常的元素将rollback元素指定为true。该 回滚应用程序异常部署描述符的子元素 可以明确指定元素以覆盖回滚值 ApplicationException注释指定或默认
这结合注释如何对其他Java EE组件(@TransactionAttribute
,@ConcurrencyManagement
等)起作用,将导致人们强烈假设子类@ApplicationException
注释将覆盖其注释家长。我通过一个简单的测试证实了这一点(显示的代码不全):
@ApplicationException(inherited = true, rollback = true)
public class MyBaseException extends RuntimeException {
// Constructors
}
public class MySubException1 extends MyBaseException {
// Constructors
}
@ApplicationException(rollback = false)
public class MySubException2 extends MyBaseException {
// Constructors
}
@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
@TransactionAttribute(TransactionAttributeType.REQUIRED)
@Path("/misc/exception")
@Produces(MediaType.APPLICATION_JSON)
public class ExceptionResourceImpl {
@Inject
private BaseDAO baseDAO;
public ExceptionResourceImpl() {
super();
}
@GET
@Path("/app/{id}")
public Response getApplicationException(@PathParam("id") final String id) {
final PaymentTypeModel model = new PaymentTypeModel();
model.setPayment("Key" + System.currentTimeMillis());
if ("1".equals(id)) {
baseDAO.create(model);
throw new MySubException1(
"Throwing sub exception 1, default annotation behaviour");
} else if ("2".equals(id)) {
baseDAO.create(model);
throw new MySubException2(
"Throwing sub exception 2, overrides annotation behaviour");
} else {
return Response.status(Status.BAD_REQUEST)
.entity("Must supply id of 1 or 2").build();
}
}
}
结果:
MySubException2
处理。*编辑*
JSR 318通过使用示例来澄清继承的ApplicationException
注释的行为。
在以下示例中:
@ApplicationException(rollback = true)公共类ExceptionA扩展 RuntimeException
公共类ExceptionB扩展了ExceptionA
@ApplicationException(inherited = false,rollback = false)公共类 ExceptionC扩展了ExceptionB
公共类ExceptionD扩展了ExceptionC
ExceptionA是一个带有事务回滚的应用程序异常。 ExceptionB是具有事务回滚的应用程序异常。 ExceptionC是没有事务回滚的应用程序异常。 ExceptionD不是应用程序异常
这证实了我原来的陈述和测试。
答案 1 :(得分:4)
EJB 3.1规范(JSR 318)在第14.2.1节中解释了这一点。有一个例子:
In the following example :
@ApplicationException(rollback=true)
public class ExceptionA extends RuntimeException
public class ExceptionB extends ExceptionA
@ApplicationException(inherited=false, rollback=false)
public class ExceptionC extends ExceptionB
public class ExceptionD extends ExceptionC
ExceptionA is an application exception with transaction rollback.
ExceptionB is an application exception with transaction rollback.
ExceptionC is an application exception without transaction rollback.
ExceptionD is not an application exception.