gpt4 book ai didi

java - 无法获取 PSQLException 的错误消息

转载 作者:行者123 更新时间:2023-11-29 13:15:28 27 4
gpt4 key购买 nike

我开发了一个 API 服务,可以将一些数据添加到数据库中。我为实体的 name 字段设置了唯一约束。每当我尝试插入重复的 name 值时,我都会给出以下堆栈跟踪。

Caused by: org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "uk_tten_courseservice_program_table_program_name"
Detail: Key (program_name)=(jkjkncj) already exists.
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2103)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1836)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:512)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:388)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:334)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:208)
... 119 more

这是嵌套异常之一,我希望从中将错误消息发送到前端。根异常是:

org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [uk_tten_courseservice_program_table_program_name]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement

我在实体类中添加的内容如下:

@Entity
@Table(name = "tten_courseservice_program_table", uniqueConstraints = {
@UniqueConstraint(name = "uk_tten_courseservice_program_table_program_name", columnNames = { "program_name" }) })
public class Program {

@Column(name = "program_name")
private String programName;
//other attributes and getter setters.
}

那么我在这里缺少什么?我试过放置:

catch(PSQLexception e)

但它没有捕捉到我的错误,因为它不是根异常。 DataIntegrityException 有非常模糊的消息,例如:

could not execute statement; SQL [n/a]; constraint [uk_tten_courseservice_program_table_program_name]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement

还有其他方法可以实现吗?我知道的一种方法是在保存每条记录之前在数据库上运行搜索查询以检查它是否已经存在,但我认为它不会有效。提前致谢。

最佳答案

要处理此类异常,您可以实现 ExceptionHandler .要获取异常的根本原因,您可以使用实用方法 org.springframework.core.NestedExceptionUtils#getMostSpecificCause

例子:

@ControllerAdvice
public class ExceptionHandler {

@ExceptionHandler(DataIntegrityViolationException.class)
public ResponseEntity<?> conflict(DataIntegrityViolationException e) {

String message = NestedExceptionUtils.getMostSpecificCause(e).getMessage();
ErrorMessage errorMessage = new ErrorMessage(message);
return new ResponseEntity<>(errorMessage), HttpStatus.CONFLICT);
}
}

ErrorMessage 是您的自定义错误消息类。

附加信息:https://www.toptal.com/java/spring-boot-rest-api-error-handling

关于java - 无法获取 PSQLException 的错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49800782/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com