R2DBC Postgres SQL 枚举问题
R2DBC Postgres SQL Enum Issue
作为学习 r2DBC 的一部分,我遇到了枚举转换面临的问题。我在这里使用 PostgreSQL。
在读取评级为 PG-13 和 NC-17(带破折号的任何内容) 的电影数据时,我遇到了问题。
下面是我的架构 table
create table film
(
film_id integer default nextval('film_film_id_seq'::regclass) not null
constraint film_pkey
primary key,
title varchar(255) not null,
description text,
release_year year,
language_id smallint not null
constraint film_language_id_fkey
references language
on update cascade on delete restrict,
rental_duration smallint default 3 not null,
rental_rate numeric(4, 2) default 4.99 not null,
length smallint,
replacement_cost numeric(5, 2) default 19.99 not null,
rating mpaa_rating default 'G'::mpaa_rating,
last_update timestamp default now() not null,
special_features text[]
);
而mpaa_rating定义为
create type mpaa_rating as enum ('G', 'PG', 'PG-13', 'R', 'NC-17');
这是我的代码,用于在我的配置中注册转换器
@Configuration
@EnableTransactionManagement
@EnableR2dbcRepositories
@EnableR2dbcAuditing
public class DVDRentalDBConfiguration extends AbstractR2dbcConfiguration {
@Bean
public ConnectionFactory connectionFactory() {
System.out.println("Initializing postgreSQL connection factory");
return new PostgresqlConnectionFactory(
PostgresqlConnectionConfiguration.builder()
.host("localhost")
.database("dvdrental")
.username("postgres")
.password("postgres")
.codecRegistrar(EnumCodec.builder().withEnum("mpaa_rating", Rating.class).build())
.build()
);
}
@Override
protected List<Object> getCustomConverters() {
return Collections.singletonList(new RatingWritingConverter());
}
@Bean
ReactiveTransactionManager transactionManager(ConnectionFactory connectionFactory) {
System.out.println("Initializing postgreSQL connection factory");
return new R2dbcTransactionManager(connectionFactory);
}
}
我的检索代码非常简单
private Mono<FilmModel> getFilmById(Long id) {
return filmRepository.findById(id).switchIfEmpty(Mono.error(DataFormatException::new));
}
添加抛出的异常https://gist.github.com/harryalto/bd51bbcdd081868c5064c808d08205e4
我尝试研究堆栈溢出但无法找出问题所在。非常感谢任何帮助。
如果你使用Spring Boot/Spring Data R2dbc将table映射到POJO,你可以跳过Postgres中的enum定义,默认Spring Data R2dbc会在数据库端将枚举处理为 varchar/char,并在 java POJO 中使用枚举,检查 my example, and schema sql script and mapped entity class。 Spring 启动已注册的映射转换器以自动转换它们。
如果您想自己处理 Enum 类型,请选中 this example。
作为学习 r2DBC 的一部分,我遇到了枚举转换面临的问题。我在这里使用 PostgreSQL。 在读取评级为 PG-13 和 NC-17(带破折号的任何内容) 的电影数据时,我遇到了问题。
下面是我的架构 table
create table film
(
film_id integer default nextval('film_film_id_seq'::regclass) not null
constraint film_pkey
primary key,
title varchar(255) not null,
description text,
release_year year,
language_id smallint not null
constraint film_language_id_fkey
references language
on update cascade on delete restrict,
rental_duration smallint default 3 not null,
rental_rate numeric(4, 2) default 4.99 not null,
length smallint,
replacement_cost numeric(5, 2) default 19.99 not null,
rating mpaa_rating default 'G'::mpaa_rating,
last_update timestamp default now() not null,
special_features text[]
);
而mpaa_rating定义为
create type mpaa_rating as enum ('G', 'PG', 'PG-13', 'R', 'NC-17');
这是我的代码,用于在我的配置中注册转换器
@Configuration
@EnableTransactionManagement
@EnableR2dbcRepositories
@EnableR2dbcAuditing
public class DVDRentalDBConfiguration extends AbstractR2dbcConfiguration {
@Bean
public ConnectionFactory connectionFactory() {
System.out.println("Initializing postgreSQL connection factory");
return new PostgresqlConnectionFactory(
PostgresqlConnectionConfiguration.builder()
.host("localhost")
.database("dvdrental")
.username("postgres")
.password("postgres")
.codecRegistrar(EnumCodec.builder().withEnum("mpaa_rating", Rating.class).build())
.build()
);
}
@Override
protected List<Object> getCustomConverters() {
return Collections.singletonList(new RatingWritingConverter());
}
@Bean
ReactiveTransactionManager transactionManager(ConnectionFactory connectionFactory) {
System.out.println("Initializing postgreSQL connection factory");
return new R2dbcTransactionManager(connectionFactory);
}
}
我的检索代码非常简单
private Mono<FilmModel> getFilmById(Long id) {
return filmRepository.findById(id).switchIfEmpty(Mono.error(DataFormatException::new));
}
添加抛出的异常https://gist.github.com/harryalto/bd51bbcdd081868c5064c808d08205e4
我尝试研究堆栈溢出但无法找出问题所在。非常感谢任何帮助。
如果你使用Spring Boot/Spring Data R2dbc将table映射到POJO,你可以跳过Postgres中的enum定义,默认Spring Data R2dbc会在数据库端将枚举处理为 varchar/char,并在 java POJO 中使用枚举,检查 my example, and schema sql script and mapped entity class。 Spring 启动已注册的映射转换器以自动转换它们。
如果您想自己处理 Enum 类型,请选中 this example。