我正在尝试使用最新版本的 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 按预期工作:作为临时解决方法,您可以复制
EnumCodec
在您的代码库中并应用来自 #302
的修复程序直到新版本的 R2DBC Postgres 可用。
关于spring - 如何在 r2dbc-postgresql 中使用 EnumCodec,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63031908/