gpt4 book ai didi

spring-boot - 来自触发器的异常映射 - spring-boot 2.4.x + jOOQ

转载 作者:行者123 更新时间:2023-12-05 06:50:56 28 4
gpt4 key购买 nike

我们正在使用 spring-boot 和 spring-boot-starter-jooq。对于一些复杂的约束检查,使用触发器会引发特定消息的错误。异常被持久层捕获并转化为业务异常。

该行为在上一个 spring boot 版本 2.4.x 中已更改。例如带有 scherma 的 hsqldb:

CREATE TABLE tab1 (
K INT PRIMARY KEY
)^;

CREATE TRIGGER trig1 BEFORE INSERT ON tab1
BEGIN ATOMIC
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'some error';
END^;

插入表的代码:

    @Transactional
public void withTriggerException() {
create.insertInto(DSL.table("tab1"))
.set(DSL.field("k"), 1)
.execute();
}

抛出异常的类型和消息与spring-boot版本不同。

2.3.6, 2.3.9

org.springframework.jdbc.UncategorizedSQLException: jOOQ; SQL 的未分类 SQLException [insert into tab1 (k) values (cast(? as int))]; SQL状态[45000];错误代码 [5800];一些错误;嵌套异常是 java.sql.SQLException: 一些错误

2.4.0, 2.4.1, 2.4.2

java.lang.NullPointerException: null

2.4.3

org.jooq.exception.DataAccessException:SQL [insert into tab1 (k) values (?)];未指定的运行时异常

    at org.jooq_3.14.7.HSQLDB.debug(Unknown Source) ~[na:na]
at org.jooq.impl.Tools.translate(Tools.java:2892) ~[jooq-3.14.7.jar:na]
at org.jooq.impl.DefaultExecuteContext.exception(DefaultExecuteContext.java:730) ~[jooq-3.14.7.jar:na]
at org.springframework.boot.autoconfigure.jooq.JooqExceptionTranslator.handle(JooqExceptionTranslator.java:83) ~[spring-boot-autoconfigure-2.4.3.jar:2.4.3]
at org.springframework.boot.autoconfigure.jooq.JooqExceptionTranslator.exception(JooqExceptionTranslator.java:55) ~[spring-boot-autoconfigure-2.4.3.jar:2.4.3]
at org.jooq.impl.ExecuteListeners.exception(ExecuteListeners.java:274) ~[jooq-3.14.7.jar:na]
at org.jooq.impl.AbstractQuery.execute(AbstractQuery.java:390) ~[jooq-3.14.7.jar:na]
at org.jooq.impl.AbstractDelegatingQuery.execute(AbstractDelegatingQuery.java:119) ~[jooq-3.14.7.jar:na]
at com.example.demo.FooDAO.withTriggerException(DemoApplication.java:38) ~[classes/:na]
...

该行为已在 hsqldb 上重现,但在 PostgreSQL 上是相同的。其他错误(重复键、外键等)按预期工作。

有可能从 spring-boot 2.4.x 的触发器中获取错误消息(示例中的“some error”)吗?

最佳答案

您可能遇到了这个问题:

可以在此处查看有关在 jOOQ 中产生此 NPE 回归的 Spring 不兼容更改的一些背景:

修复应该在 Spring Boot 2.5.0 和 2.4.3 中可用:

您应该能够使用 DataAccessException.getCause(Class) 从 jOOQ 的 DataAccessException 访问 JDBC SQLException ,例如

exception.getCause(SQLException.class);

但可能有更好的方法让 Spring 异常翻译器直接为您提供实际原因。

关于spring-boot - 来自触发器的异常映射 - spring-boot 2.4.x + jOOQ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66279277/

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