2

我想知道在 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 从未执行?

4

2 回答 2

3

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

于 2012-12-22T22:08:25.600 回答
1

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

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

于 2012-12-22T22:10:30.753 回答