Исключение SQL не обрабатывается в WebService

Мы разработали реализацию 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; 
   } 
} 

Не могли бы вы помочь мне решить эту проблему.

Заранее спасибо.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
130
1

Ответы 1

Когда вы вызываете em.persist(recycle);, ваш объект recycle присоединяется к вашему EntityManager. Это не означает, что объект recycle вставляется (сохраняется) в базу данных немедленно. EntityManager вставляет объект recycle в базу данных, когда текущая транзакция фиксируется. Похоже, ваш метод public void recycleOperation является транзакционным. Это означает, что EntityManager вставляет объект recycle после завершения выполнения метода recycleOperation. Следовательно, исключение, которое вы видите, возникло, когда выполнение метода recycleOperation завершено.

Короче говоря, вы должны поймать исключение в методе, в котором вызывается recycleOperation.

Спасибо за ответ. Как обработать исключение, если этот метод является методом веб-службы и вызывается по запросу клиента?

Anıl Emre Özçelik 11.07.2018 09:13

@ AnılEmreÖzçelik, вы используете Spring REST? Затем вы можете использовать @ExceptionHandler для обработки исключений верхнего уровня. Подробности: baeldung.com/exception-handling-for-rest-with-spring

Sazzadur Rahaman 11.07.2018 17:22

Я использую веб-службы SOAP.

Anıl Emre Özçelik 13.07.2018 10:14

Другие вопросы по теме