java - WebService 中未处理 SQL 异常
问题描述
我们开发了无状态 Web 服务实现。我们使用 JPA 作为 ORM 层来执行数据库操作。在服务方法中,我们使用实体管理器来持久化实体。在将相同的记录保存到表中时,我们无法处理这些异常"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
对象立即插入(持久)到数据库中。recycle
当正在进行的事务提交时,EntityManager 将对象插入数据库。看起来您的public void recycleOperation
方法是事务性的。这意味着 EntityManagerrecycle
在完成方法执行后插入对象recycleOperation
。因此,您看到的异常是在recycleOperation
方法执行完成时产生的。
长话短说,您应该在recycleOperation
调用的方法中捕获异常。
推荐阅读
- javascript - 如何使用 Dynamoose 正确查询索引
- spring-boot - Spring Webflux 上传大图像文件并使用 WebClient 以流的方式发送文件
- r - BiodiversityR::rankabundance() 函数不计算 plower 和 pupper 值
- arrays - 如何从分布在数组中多个字节的位中检索值?
- javascript - 从中获取行数
零件 - c - 我用 C 语言编写了一个程序,它接受两个输入,x 和 n,并将 x 提高到 n 次方。10^10 不起作用,发生了什么?
- r - I want to simulate and obtain best ARIMA ith number of time in R
- image-processing - skimage 分水岭“过度分割”背后的关键参数
- swift - Xcode 警告:不可变属性将不会被解码,因为它声明了一个不能被覆盖的初始值
- python - R 中 (matrix)*(vector) 的 Python 等价物