我正在尝试使用来自r2dbc-postgresql (0.8.4)的最新版本的EnumCodec,但没有成功,我想知道您是否可以帮助我。
我还使用了spring r2dbc版本1.1.1。
我以GitHub为例,在Postgres中创建了一个枚举类型“my_enum”,以及一个包含‘name’(文本)和‘value’(my_enum)的表“sample_table”。
然后,我做了一个例子:
SQL:
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来与DB通信。我尝试使用两种方法插入:
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;
}但我使用这两种方法得到相同的错误:
列"value“的类型为my_enum,而表达式的类型为变量。
你能不能帮我理解一下我做错了什么,或者给我举个例子?我很感激你的帮助!
发布于 2020-07-22 13:22:35
Spring数据将枚举值视为默认转换为String的值。您需要注册一个保留类型的Converter,方法是按原样写入枚举类型。
@WritingConverter
class MyEnumTypeConverter implements Converter<MyEnumType, MyEnumType> {
@Override
public MyEnumType convert(MyEnumType source) {
return source;
}
}接下来,您需要注册转换器。如果使用SpringDataR2DBC的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驱动程序中有两个bug阻止Spring数据按预期工作:
作为临时解决办法,您可以在代码库中复制EnumCodec,并从#302中应用修复程序,直到R2DBC Postgres的新版本可用为止。
发布于 2020-09-13 12:51:41
我尝试在我的示例项目中使用pg枚举类型和Java类。
@ReadingConverter来读取自定义枚举。
检查我在这里的例子。Spring R2dbc说,如果使用驱动程序内置机制来处理enum,就必须注册一个EnumWriteSupport。但是根据我的经验,当使用Spring R2dbc时,可以自动处理写入,但是从Postgres读取枚举需要读取转换器。
https://stackoverflow.com/questions/63031908
复制相似问题