如何在 r2dbc-postgresql 中使用 EnumCodec

ela*_*dya 7 postgresql enums spring spring-data-r2dbc r2dbc

我试图使用最新版本的 r2dbc-postgresql (0.8.4) 中的 EnumCodec,但没有成功,我想知道你是否可以帮助我。

\n

我还使用 spring-data-r2dbc 版本 1.1.1。

\n

我从 GitHub 中获取了确切的示例,并在 Postgres 中创建了一个枚举类型 \xe2\x80\x9cmy_enum\xe2\x80\x9d,\n 和一个包含 \xe2\ 的表 \xe2\x80\x9csample_table\xe2\x80\x9d x80\x98name\xe2\x80\x99 (文本)和 \xe2\x80\x98value\xe2\x80\x99 (my_enum)。

\n

然后我按照例子做了:

\n

SQL:

\n
CREATE TYPE my_enum AS ENUM ('FIRST', 'SECOND');\n
Run Code Online (Sandbox Code Playgroud)\n

Java模型:

\n
enum MyEnumType {\n  FIRST, SECOND;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

编解码器注册:

\n
PostgresqlConnectionConfiguration.builder()\n.codecRegistrar(EnumCodec.builder().withEnum("my_enum", MyEnumType.class).build());\n
Run Code Online (Sandbox Code Playgroud)\n

我使用 DatabaseClient 来与数据库通信。\n我尝试使用两种方法插入:

\n
databaseClient.insert().into(SampleTable.class)\n.using(sampleTable).fetch().rowsUpdated();\n
Run Code Online (Sandbox Code Playgroud)\n

或者:

\n
databaseClient.insert().into("sample_table")\n.value("name", sampleTable.getName())\n.value("value", sampleTable.getValue())\n.then();\n
Run Code Online (Sandbox Code Playgroud)\n

其中 SampleTable 是:

\n
@Data\n@AllArgsConstructor\n@NoArgsConstructor\n@Builder\n@Table("sample_table")\n@JsonIgnoreProperties(ignoreUnknown = true)\n@JsonInclude(JsonInclude.Include.NON_NULL)\npublic class SampleTable implements Serializable {\n   private String name;\n   @Column("value")\n   @JsonProperty("value")\n   private MyEnumType value;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

但我使用两者都得到同样的错误:

\n

列“value”的类型为 my_enum,但表达式的类型为字符变化

\n

您能否帮助我理解我做错了什么,或者向我推荐一些工作示例?\n我感谢您的帮助!

\n

mp9*_*1de 7

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

\n
@WritingConverter\nclass MyEnumTypeConverter implements Converter<MyEnumType, MyEnumType> {\n    @Override\n    public MyEnumType convert(MyEnumType source) {\n        return source;\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

接下来,您需要注册转换器。如果您使用 Spring Data R2DBC AbstractR2dbcConfiguration,则覆盖getCustomConverters()

\n
class MyConfiguration extends AbstractR2dbcConfiguration {\n\n    @Override\n    protected List<Object> getCustomConverters() {\n        return Collections.singletonList(new MyEnumTypeConverter());\n    }\n\n  // \xe2\x80\xa6\n}\n
Run Code Online (Sandbox Code Playgroud)\n

或者,如果您配置DatabaseClient独立,则需要更多代码:

\n
PostgresqlConnectionConfiguration configuration = PostgresqlConnectionConfiguration.builder()\n        .codecRegistrar(EnumCodec.builder().withEnum("my_enum", MyEnumType.class).build())\n        .host(\xe2\x80\xa6)\n        .username(\xe2\x80\xa6)\n        .password(\xe2\x80\xa6)\n        .database(\xe2\x80\xa6).build();\n\nR2dbcDialect dialect = PostgresDialect.INSTANCE;\nDefaultReactiveDataAccessStrategy strategy = new DefaultReactiveDataAccessStrategy(dialect, Collections.singletonList(new MyEnumTypeConverter()));\n\nDatabaseClient databaseClient = DatabaseClient.builder()\n        .connectionFactory(new PostgresqlConnectionFactory(configuration))\n        .dataAccessStrategy(strategy)\n        .build();\n    \n
Run Code Online (Sandbox Code Playgroud)\n

但是,R2DBC 驱动程序中有两个错误导致 Spring Data 无法按预期工作:

\n\n

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

\n