如何在JavaEE 6中捕获OptimisticLockException?

时间:2012-12-22 21:54:03

标签: java jpa java-ee-6 optimistic-locking

我想知道在JavaEE 6中捕获OptimisticLockException的最佳方法是什么。我有以下EJB:

@Stateless
public class SeminarBooking {

public void bookSeminar(Long seminarId, int numberOfPersons) {
    ...
    //check capacity & do booking
    //OptimisticLockException can occur in this method
}

这是我的REST界面:

@Path("/seminars")
@Produces("application/xml")
@Stateless
public class SeminarResource {

    @GET
    @Path("{id}/book")
    public Seminar bookSeminar(@PathParam("id") Long id, @QueryParam("persons") Integer persons) {
        try {
            seminarBooking.bookSeminar(id, persons);
            return seminarBooking.getSeminar(id);
        }
        catch(Exception e) {
            //why is this never called?
            logger.error(This will never happen, e);
            throw new WebApplicationException(e);
        }
}

在REST界面中,我捕获了所有异常,此外,如果我从浏览器调用接口,我会看到OptimisticLockException,那么为什么catch-Block从未执行过?

2 个答案:

答案 0 :(得分:3)

显而易见的答案是,在该try块中没有引发有问题的异常。尝试读取堆栈跟踪以查看它从哪里抛出。鉴于它与持久性有关,它可能会抛到您的交易边界而不是您认为的位置。

答案 1 :(得分:1)

可能永远不会调用它,因为SeminarResource是一个事务EJB。这意味着事务在其bookSeminar()方法返回后提交,而不是在返回之前提交。

这个bean应该不是事务性的。如果不是,则事务将在调用SeminarBooking服务时启动,并在返回时提交。并且您将能够捕获提交抛出的异常。