spring - 如何在 r2dbc-postgresql 中使用 EnumCodec

标签 spring postgresql enums spring-data-r2dbc r2dbc

我正在尝试使用最新版本的 r2dbc-postgresql (0.8.4) 中的 EnumCodec 失败,我想知道您是否可以帮助我。
我也使用 spring-data-r2dbc 版本 1.1.1。
我从 GitHub 中获取了确切的示例,并在我的 Postgres 中创建了一个枚举类型“my_enum”,
以及包含“名称”(文本)和“值”(my_enum)的表“sample_table”。
然后我按照示例进行了操作:
查询语句:

CREATE TYPE my_enum AS ENUM ('FIRST', 'SECOND');
Java模型:
enum MyEnumType {
  FIRST, SECOND;
}
编解码器注册:
PostgresqlConnectionConfiguration.builder()
.codecRegistrar(EnumCodec.builder().withEnum("my_enum", MyEnumType.class).build());
我使用 DatabaseClient 来与数据库通信。
我尝试使用两种方法插入:
databaseClient.insert().into(SampleTable.class)
.using(sampleTable).fetch().rowsUpdated();
或者:
databaseClient.insert().into("sample_table")
.value("name", sampleTable.getName())
.value("value", sampleTable.getValue())
.then();
其中 SampleTable 是:
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Table("sample_table")
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class SampleTable implements Serializable {
   private String name;
   @Column("value")
   @JsonProperty("value")
   private MyEnumType value;
}
但是我使用两者都得到相同的错误:
列“值”的类型为 my_enum,但表达式的类型为不同的字符
你能帮我理解我做错了什么,或者给我推荐一些工作示例吗?
我感谢您的帮助!

最佳答案

Spring Data 将枚举值视为要转换为 String 的值默认情况下。您需要注册一个 Converter通过按原样编写枚举类型来保留类型。

@WritingConverter
class MyEnumTypeConverter implements Converter<MyEnumType, MyEnumType> {
    @Override
    public MyEnumType convert(MyEnumType source) {
        return source;
    }
}
接下来,您需要注册转换器。如果您使用的是 Spring Data R2DBC 的 AbstractR2dbcConfiguration ,然后覆盖 getCustomConverters() :
class MyConfiguration extends AbstractR2dbcConfiguration {

    @Override
    protected List<Object> getCustomConverters() {
        return Collections.singletonList(new MyEnumTypeConverter());
    }

  // …
}
或者,如果您配置 DatabaseClient独立,那么你需要更多的代码:
PostgresqlConnectionConfiguration configuration = PostgresqlConnectionConfiguration.builder()
        .codecRegistrar(EnumCodec.builder().withEnum("my_enum", MyEnumType.class).build())
        .host(…)
        .username(…)
        .password(…)
        .database(…).build();

R2dbcDialect dialect = PostgresDialect.INSTANCE;
DefaultReactiveDataAccessStrategy strategy = new DefaultReactiveDataAccessStrategy(dialect, Collections.singletonList(new MyEnumTypeConverter()));

DatabaseClient databaseClient = DatabaseClient.builder()
        .connectionFactory(new PostgresqlConnectionFactory(configuration))
        .dataAccessStrategy(strategy)
        .build();
    
但是,R2DBC 驱动程序中有两个错误会阻止 Spring Data 按预期工作:
  • Row.decode(…) fails for enum type with IllegalArgumentException: 72093 is not a valid object id #301
  • EnumCodec decoding fails if the requested value type is Object #302

  • 作为临时解决方法,您可以复制 EnumCodec在您的代码库中并应用来自 #302 的修复程序直到新版本的 R2DBC Postgres 可用。

    关于spring - 如何在 r2dbc-postgresql 中使用 EnumCodec,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63031908/

    相关文章:

    java - 在与当前类同名的类上使用 Spring @Autowired

    java - Maven/Spring/Hibernate NoSuchMethodError : org. hibernate .engine.jdbc.spi.JdbcServices.getConnectionProvider()

    postgresql - 通过 CLI 重置 Azure PostgreSQL 服务器用户密码

    java - 当类的属性之一是枚举变量时,如何实现该类?

    java - 如何在 Spring Boot 1.5.1 Hibernate 中防止隐式缓存

    java - 收到 403 禁止错误

    mysql - 从 PostgreSQL 翻译到 MariaDB 的这个查询有什么问题?

    postgresql - 命令StdinPipe关闭太早

    ruby-on-rails - Rails - 在 .where 查询中使用枚举

    c++ - 枚举为无符号整数