저는 REST 웹 앱을 구축하면서 JPA toplink-essential을 사용하고 있습니다.서블릿 수준에서 OptimisticLockException을 잡는 방법?
하나의 엔티티를 찾고 삭제하는 서블릿이 있습니다.
아래 코드는 서블릿 수준에서 낙관적 인 잠금 예외를 잡을 수 있다고 생각했지만 그렇지 않습니다! 대신 RollbackException이 throw되고 설명서에 다음과 같이 나와 있습니다.
하지만 Netbean IDE GlassFish 로그가 표시되면 어딘가에 optimisticLockException이 발생합니다. 그것은 단지 내 코드에 잡히지 않고있다. (필자의 시스템 인쇄 메시지가 표시되지 않기 때문에 그 안에 들어 가지 않을 것입니다.)
각 패키지 (한 번에 하나씩)를 가져 와서 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을 잡았습니다. 나는 oracle.toplink.essentials.exceptions.OptimisticLockException을 잡기 위해 catch 절을 변경했지만 catch하지 않을 때까지 있습니다. 내 게시물에 오류 메시지를 추가했습니다. 그것은 매우 두 가지 유형의 패키지를 보여줍니다. 매우 혼란스러운 –
Ralph가 지적했듯이 예외는 em.getTransaction() 내부에서 던져져 optimisticLockException을 수동으로 잡을 수 없습니다. 유일한 방법은 롤백 예외를 잡는 것이며 "충돌"이 발생했다고 가정합니다. ??? : –
"catch (Exception e)"는 try 블록 내에서 던져진 예외 (체크되지 않았거나 체크 됨)를 잡아야한다. 예외로부터 stacktrace를 얻거나 커밋 라인에 중단 점을 넣고 코드를 단계별로 실행해야한다. 어떻게 볼 수 있습니다. – esaj