我们开发了无状态Web服务实现。我们使用JPA作为ORM层来执行数据库操作。在服务方法中,我们使用实体管理器来持久化实体。 同时将相同的记录保存到表中,我们无法处理这些异常“由于:java.sql.SQLIntegrityConstraintViolationException:ORA-00001:唯一约束(TIGOSUSCRIPTIONES.SYS_C0020549)违反了”Service方法中的异常。 它直接在客户端结果中抛出以下异常。
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)
How can I handle this exception? Following is the code we used in service method business logic.
@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;
}
}
你能帮我解决这个问题。
答案 0 :(得分:0)
@TransactionAttribute(TransactionAttributeType.REQUIRED)
这会导致该方法被包装在JTA事务中,当事务失败时,异常将被抛出给调用者。您将需要在调用者中处理此问题,或者通过异常处理程序处理此问题,或者切换方法以使用Bean托管事务。
你也可以在JPA中调用flush(),它会触发约束异常,并允许你处理它。但JTA交易仍将失败。