2

OptimisticLockExceptionJavaEE6でをキャッチするための最良の方法は何でしょうか。次の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 に答える