Skip to content

[BUG] - <title>在全局过滤器的影响下异常翻译不起作用(可能) #1192

@swit1983

Description

@swit1983

Jimmer Version

0.9.94

JDK Version

jdk21

Database

mysql

OS

Windows

Expected behavior

抛出SaveException.NotUnique异常能正常翻译

package com.kongyue.ai.enterprise.jimmer;

import com.kongyue.ai.enterprise.entity.KyEnterpriseCredentialProps;
import com.kongyue.ai.enterprise.entity.KyStaffProps;
import org.babyfish.jimmer.sql.exception.SaveException;
import org.babyfish.jimmer.sql.runtime.ExceptionTranslator;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.springframework.stereotype.Component;

@Component
public class NotUniqueExceptionTranslator implements ExceptionTranslator<SaveException.NotUnique> {

  @Override
  public @Nullable Exception translate(
      @NotNull SaveException.NotUnique exception, @NotNull Args args) {
    if (exception.isMatched(KyStaffProps.ENTERPRISE, KyStaffProps.PHONE)) {
      return new IllegalArgumentException(
          "手机号为" + exception.getValue(KyStaffProps.PHONE) + "的员工已经存在");
    } else if (exception.isMatched(KyStaffProps.ENTERPRISE, KyStaffProps.ID_CARD)) {
      return new IllegalArgumentException(
          "身份证为" + exception.getValue(KyStaffProps.ID_CARD) + "的员工已经存在");
    } else if (exception.isMatched(KyEnterpriseCredentialProps.CERTIFICATE_CODE)) {
      return new IllegalArgumentException(
          "资质编号" + exception.getValue(KyEnterpriseCredentialProps.CERTIFICATE_CODE) + "已经存在");
    }

    // 不做处理,也可以写成`return exception`
    return null;
  }
}

Actual behavior

未翻译,并没有进入异常翻译实现类

Description

情况描述一下,企业id作为租户id,有一个全局过滤器和拦截器。但是资质证书的编号是全局唯一的用注解@key修饰。根对象保存模式是SaveMode.NON_IDEMPOTENT_UPSERT,同一个租户下相同key执行修改操作,如果编号和另一个租户下冲突抛出异常SaveException.NotUnique,但是翻译没有捕获。
另外,能支持一下多租户下唯一性的问题吗?

Reproduction steps

Generated SQL

No response

Relation Model

No response

Screenshots

No response

Logs

Purpose: COMMAND(INTERCEPTOR)
SQL: select
    tb_1_.ID,
    tb_1_.certificate_code
from ky_enterprise_credential tb_1_
where
    tb_1_.certificate_code = ? /* 1 */
JDBC response status: success
Time cost: 250ms
<===Execute SQL
2025-09-17T14:47:51.850+08:00 ERROR 22204 --- [ai-enterprise] [nio-8080-exec-1] c.k.a.e.config.GlobalExceptionHandler    : 内部异常org.babyfish.jimmer.sql.exception.SaveException$NotUnique: Save error caused by the path: "<root>": Cannot save the entity, the value of the key property "[com.kongyue.ai.enterprise.entity.KyEnterpriseCredential.certificateCode]" is "1" which already exists
	at org.babyfish.jimmer.sql.ast.impl.mutation.MutationContext.createConflictKey(MutationContext.java:293) ~[jimmer-sql-0.9.94.jar:na]
	at org.babyfish.jimmer.sql.ast.impl.mutation.Rows.findMapByKeys(Rows.java:105) ~[jimmer-sql-0.9.94.jar:na]
	at org.babyfish.jimmer.sql.ast.impl.mutation.Rows.findMapByKeys(Rows.java:70) ~[jimmer-sql-0.9.94.jar:na]
	at org.babyfish.jimmer.sql.ast.impl.mutation.AbstractPreHandler.findOldMapByKeys(PreHandler.java:237) ~[jimmer-sql-0.9.94.jar:na]
	at org.babyfish.jimmer.sql.ast.impl.mutation.UpsertPreHandler.onResolve(PreHandler.java:969) ~[jimmer-sql-0.9.94.jar:na]
	at org.babyfish.jimmer.sql.ast.impl.mutation.AbstractPreHandler.resolve(PreHandler.java:527) ~[jimmer-sql-0.9.94.jar:na]
	at org.babyfish.jimmer.sql.ast.impl.mutation.UpsertPreHandler.insertedMap(PreHandler.java:904) ~[jimmer-sql-0.9.94.jar:na]
	at org.babyfish.jimmer.sql.ast.impl.mutation.PreHandler$1.iterator(PreHandler.java:69) ~[jimmer-sql-0.9.94.jar:na]
	at org.babyfish.jimmer.sql.ast.impl.mutation.Saver.saveSelf(Saver.java:422) ~[jimmer-sql-0.9.94.jar:na]
	at org.babyfish.jimmer.sql.ast.impl.mutation.Saver.saveAllImpl(Saver.java:141) ~[jimmer-sql-0.9.94.jar:na]
	at org.babyfish.jimmer.sql.ast.impl.mutation.Saver.lambda$save$0(Saver.java:65) ~[jimmer-sql-0.9.94.jar:na]
	at org.babyfish.jimmer.runtime.Internal.modifyDraft(Internal.java:193) ~[jimmer-core-0.9.94.jar:na]
	at org.babyfish.jimmer.runtime.Internal.lambda$produceList$4(Internal.java:94) ~[jimmer-core-0.9.94.jar:na]
	at org.babyfish.jimmer.runtime.Internal.usingDraftContext(Internal.java:122) ~[jimmer-core-0.9.94.jar:na]
	at org.babyfish.jimmer.runtime.Internal.produceList(Internal.java:84) ~[jimmer-core-0.9.94.jar:na]
	at org.babyfish.jimmer.sql.ast.impl.mutation.Saver.save(Saver.java:61) ~[jimmer-sql-0.9.94.jar:na]
	at org.babyfish.jimmer.sql.ast.impl.mutation.SimpleEntitySaveCommandImpl.executeImpl(SimpleEntitySaveCommandImpl.java:245) ~[jimmer-sql-0.9.94.jar:na]
	at org.babyfish.jimmer.sql.ast.impl.mutation.SimpleEntitySaveCommandImpl.lambda$execute$1(SimpleEntitySaveCommandImpl.java:223) ~[jimmer-sql-0.9.94.jar:na]
	at org.babyfish.jimmer.spring.cfg.support.SpringConnectionManager.execute(SpringConnectionManager.java:56) ~[jimmer-spring-boot-starter-0.9.94.jar:na]
	at org.babyfish.jimmer.sql.ast.impl.mutation.SimpleEntitySaveCommandImpl.execute(SimpleEntitySaveCommandImpl.java:220) ~[jimmer-sql-0.9.94.jar:na]
	at org.babyfish.jimmer.sql.ast.mutation.SimpleEntitySaveCommand.execute(SimpleEntitySaveCommand.java:287) ~[jimmer-sql-0.9.94.jar:na]

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions