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然后我按照例子做了:
\nSQL:
\nCREATE TYPE my_enum AS ENUM ('FIRST', 'SECOND');\nRun Code Online (Sandbox Code Playgroud)\nJava模型:
\nenum MyEnumType {\n FIRST, SECOND;\n}\nRun Code Online (Sandbox Code Playgroud)\n编解码器注册:
\nPostgresqlConnectionConfiguration.builder()\n.codecRegistrar(EnumCodec.builder().withEnum("my_enum", MyEnumType.class).build());\nRun Code Online (Sandbox Code Playgroud)\n我使用 DatabaseClient 来与数据库通信。\n我尝试使用两种方法插入:
\ndatabaseClient.insert().into(SampleTable.class)\n.using(sampleTable).fetch().rowsUpdated();\nRun Code Online (Sandbox Code Playgroud)\n或者:
\ndatabaseClient.insert().into("sample_table")\n.value("name", sampleTable.getName())\n.value("value", sampleTable.getValue())\n.then();\nRun 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}\nRun Code Online (Sandbox Code Playgroud)\n但我使用两者都得到同样的错误:
\n列“value”的类型为 my_enum,但表达式的类型为字符变化
\n您能否帮助我理解我做错了什么,或者向我推荐一些工作示例?\n我感谢您的帮助!
\nSpring Data 将枚举值视为String默认要转换的值。您需要Converter通过按原样编写枚举类型来注册保留类型的 a。
@WritingConverter\nclass MyEnumTypeConverter implements Converter<MyEnumType, MyEnumType> {\n @Override\n public MyEnumType convert(MyEnumType source) {\n return source;\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n接下来,您需要注册转换器。如果您使用 Spring Data R2DBC AbstractR2dbcConfiguration,则覆盖getCustomConverters():
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}\nRun Code Online (Sandbox Code Playgroud)\n或者,如果您配置DatabaseClient独立,则需要更多代码:
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 \nRun Code Online (Sandbox Code Playgroud)\n但是,R2DBC 驱动程序中有两个错误导致 Spring Data 无法按预期工作:
\n作为临时解决方法,您可以EnumCodec在代码库中进行复制并应用修复程序,#302直到 R2DBC Postgres 的新版本可用为止。
| 归档时间: |
|
| 查看次数: |
6306 次 |
| 最近记录: |