Как отловить OptimisticLockException на уровне сервлета? - PullRequest
3 голосов
/ 28 января 2011

Я использую JPA toplink-essential, создаю веб-приложение REST.

У меня есть сервлет, который находит одну сущность и удаляет ее.

Ниже кода я думал, что смогу поймать оптимистическую блокировкуисключение на уровне сервлетов, но это не так!Вместо этого выдается RollbackException, и вот что написано в документации:

Но затем, когда я вижу журнал Netbean IDF GlassFish, где-то выдается optimisticLockException.Это просто не попадает в мой код.(мое системное сообщение о печати не отображается, поэтому я уверен, что его там нет.)

Я пытался импортировать каждый пакет (по одному, разумеется) и тестировал с предложением catch, но оба раза, он не входит в блок catch, даже если в сообщении об ошибке указано «оптимистическое исключение».

import javax.persistence.OptimisticLockException;
import oracle.toplink.essentials.exceptions.OptimisticLockException;

Итак, где выбрасывается исключение OptimisticLockException ?????

@Path("delete")
@DELETE
@Consumes("application/json")
public Object planDelete(String content) {

   try {
            EntityManager em = EmProvider.getInstance().getEntityManagerFactory().createEntityManager();

            EntityTransaction txn = em.getTransaction();
            txn.begin();
            jObj = new JSONObject(content);
            MyBeany bean = em.find(123);

            bean.setVersion(Integer.parseInt(12345));
            em.remove(bean);


            //here commit!!!!!
            em.getTransaction().commit(); 
        }
        catch(OptimisticLockException e) {  //this is not caught here :(
            System.out.pritnln("here");
            //EntityTransactionManager.rollback(txn);
            return HttpStatusHandler.sendConflict();
        }
        catch(RollbackException e) {
            return HttpStatusHandler.sendConflict();
        }
        catch(Exception e) {
            return HttpStatusHandler.sendServerError(e);
        }
        finally {
            if(em != null) {
                em.close();
            }
        }

Сообщение об ошибке:

[TopLink Warning]: 2011.01.28 05:11:24.007--UnitOfWork(22566987)
--Exception [TOPLINK-5006] 
(Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): 
oracle.toplink.essentials.exceptions.OptimisticLockException

    [TopLink Warning]: 2011.02.01 08:50:15.095--UnitOfWork(681660)--
javax.persistence.OptimisticLockException: Exception [TOPLINK-5006] (Oracle TopLink 
Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): 
oracle.toplink.essentials.exceptions.OptimisticLockException

Ответы [ 3 ]

3 голосов
/ 28 января 2011

Не уверен на 100%, но может ли быть так, что вы перехватываете javax.persistence.OptimisticLockException (обратите внимание на пакет), но поскольку выбрасываемое исключение - oracle.toplink.essentials.exceptions.OptimisticLockException, оно не будет поймано?Несмотря на то, что имя класса исключений одно и то же, это не тот же класс.

2 голосов
/ 28 января 2011

Я бы предположил, что он добавляется в оператор em.getTransaction().commit();.

Поскольку Java-документ RollbackExceptio n, если сказано:

Выдается провайдером постоянства при сбое EntityTransaction.commit ().

Я твердо верю, что это не тот код, который вы действительно используете (он не будет компилироваться из-за отсутствия) в строке bean.setVersion(Integer.parseInt(12345);), но я «надеюсь», что реальный код имеет ту же проблему. 1014 *

0 голосов
/ 22 августа 2011

Вы пытались вызвать entityManager.flush ();внутри вашего блока try / catch?Когда JPA сбрасывается, возникает исключение OptimisticLock.

Также вам не нужно совершать транзакцию так, как вы это делали.Вы просто могли бы сделать txn.commit ();вместо em.getTransaction (). commit ();.

у меня похожая ситуация, когда я могу перехватить javax.persistence.OptimisticLockException.В моем случае я сделал конечную точку ReST SSB и внедрил диспетчер сущностей.Затем я вызываю метод на другом SSB, который также вводится и действует как контроллер для этой части бизнес-логики.Этот контроллер выполняет flush () и перехватывает OLEX, а также повторно генерирует и ApplicationException, которые перехватывает конечная точка Rest / SSB и повторяет попытку.Используя этот шаблон, вы также должны обязательно указать TransactionAttributeType.RequiresNew, чтобы каждая повторная попытка выполнялась в новой транзакции, поскольку OLEX лишает законной силы старую транзакцию.

...