Я использую JPA toplink-essential, создавая веб-приложение REST.Как поймать OptimisticLockException на уровне сервлета?
У меня есть сервлет, который находит одно сущность и удаляет его.
Ниже код Я думал, что могу поймать оптимистичное исключение блокировки на уровне сервлета, но его нет! Вместо этого RollbackException выбрасывается, и вот что написано в документации:
Но тогда, когда я вижу журнал NetSE IDE 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
Хорошая точка. Я ловил javax.persistence.OptimisticLockException код выше. Я изменил предложение catch, чтобы поймать oracle.toplink.essentials.exceptions.OptimisticLockException, но до тех пор, пока не поймает. Я добавил сообщение об ошибке в мой пост. он показывает оба типа пакетов .. очень запутанным –
Итак, я предполагаю, что Ральф указал, исключение выбрано внутри em.getTransaction(). commit, поэтому я не могу поймать optimisticLockException вручную. Единственный способ - исключить исключение отката и предположить, что «конфликт» произошел ??? :( –
Этот «catch (Exception e)» должен поймать любое исключение (не отмеченное или проверенное), брошенное внутри try-block. Вероятно, вы должны получить стек из этого исключения и/или поставить точку останова в строке фиксации и поместить код чтобы увидеть, что произойдет. – esaj