Мы разработали реализацию Web-сервиса без сохранения состояния. Мы использовали JPA в качестве уровня ORM для выполнения операций с базой данных. В методах обслуживания мы использовали Entity Manager для сохранения объекта. сохраняя ту же запись в таблице, мы не можем обработать это исключение "Caused by: java.sql.SQLIntegrityConstraintViolationException: ORA-00001: unique constraint (TIGOSUSCRIPTIONES.SYS_C0020549) violated" exception in Service method. It is directly throwing the following exception in client result.
Exception in thread "main" javax.xml.ws.soap.SOAPFaultException: Transaction rolled back
at com.sun.xml.internal.ws.fault.SOAP11Fault.getProtocolException(SOAP11Fault.java:178)
at com.sun.xml.internal.ws.fault.SOAPFaultBuilder.createException(SOAPFaultBuilder.java:111)
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:108)
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:78)
at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(SEIStub.java:107)
at $Proxy30.registerSaleOutcome(Unknown Source)
Как справиться с этим исключением. Ниже приведен код, который мы использовали в бизнес-логике метода обслуживания.
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void recycleOperation(Recycle recycle) throws RecycleFault_Exception{
try{
em.persist(recycle);
} catch(Exception e){
//not coming to this block
log.error("Exception in Data Insertion:"+e.getMessage());
RecycleFault fault = new RecycleFault();
fault.setErrorCode("101");
fault.setMessage("Record is already Existed");
RecycleFault_Exception faultExp = new RecycleFault_Exception("RecycleFault Exception", fault);
throw faultExp;
}
}
Не могли бы вы помочь мне решить эту проблему.
Заранее спасибо.




Когда вы вызываете em.persist(recycle);, ваш объект recycle присоединяется к вашему EntityManager. Это не означает, что объект recycle вставляется (сохраняется) в базу данных немедленно. EntityManager вставляет объект recycle в базу данных, когда текущая транзакция фиксируется. Похоже, ваш метод public void recycleOperation является транзакционным. Это означает, что EntityManager вставляет объект recycle после завершения выполнения метода recycleOperation. Следовательно, исключение, которое вы видите, возникло, когда выполнение метода recycleOperation завершено.
Короче говоря, вы должны поймать исключение в методе, в котором вызывается recycleOperation.
@ AnılEmreÖzçelik, вы используете Spring REST? Затем вы можете использовать @ExceptionHandler для обработки исключений верхнего уровня. Подробности: baeldung.com/exception-handling-for-rest-with-spring
Я использую веб-службы SOAP.
Спасибо за ответ. Как обработать исключение, если этот метод является методом веб-службы и вызывается по запросу клиента?