Spring 引导 R2DBC 无法在 MariaDB 中存储字符字段
Spring Boot R2DBC fails to store character field in MariaDB
我正在使用 Spring Reactive + MariaDB 构建 REST API。
我正在尝试存储一个用户对象。它具有这些属性。
电子邮件地址(字符串)、全名(字符串)、密码(字符串)
数据库中的等效列是:
电子邮件地址 (varchar)、全名 (varchar)、密码 (varchar)
它适用于上述字段,但是当我在我的用户对象中添加一个类型为 (private char status
) 的新字段,并在数据库中的 table 中添加一个等效列时 (status char(1)
),它失败并出现以下错误。
2021-02-14 | 18:37:51.904 | reactor-tcp-nio-2 | ERROR | o.s.b.a.w.r.e.AbstractErrorWebExceptionHandler | [0aef325c-1] 500 Server Error for HTTP POST "/users"
java.lang.IllegalArgumentException: No encoder for class java.lang.Character (parameter at index 3)
at org.mariadb.r2dbc.MariadbClientParameterizedQueryStatement.bind(MariadbClientParameterizedQueryStatement.java:93)
Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:
Error has been observed at the following site(s):
|_ checkpoint ⇢ Handler com.timesheet.timesheetapi.controller.UserController#post(User) [DispatcherHandler]
|_ checkpoint ⇢ HTTP POST "/users" [ExceptionHandlingWebHandler]
Stack trace:
at org.mariadb.r2dbc.MariadbClientParameterizedQueryStatement.bind(MariadbClientParameterizedQueryStatement.java:93)
at org.mariadb.r2dbc.MariadbClientParameterizedQueryStatement.bind(MariadbClientParameterizedQueryStatement.java:34)
...
这是我的 class:
public class User {
@Id
private long id;
private String email;
@Column("fullName")
private String fullName;
private String password;
private char status;
@Column("crDate")
private LocalDateTime crDate;
@Column("updDate")
private LocalDateTime updDate;
}
您可以忽略 crDate/updDate 字段。
这是我的 table 在 MariaDB 中的定义。
CREATE TABLE `tuser` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`email` VARCHAR(100) NULL DEFAULT NULL,
`fullName` VARCHAR(100) NULL DEFAULT NULL,
`status` CHAR(1) NOT NULL DEFAULT 'D' COMMENT 'A=Active,D=Disabled',
`password` VARCHAR(100) NULL DEFAULT NULL,
`crDate` DATETIME NULL DEFAULT current_timestamp(),
`updDate` DATETIME NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=16;
这是我的 POM 的相关部分(以防有帮助)。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-r2dbc</artifactId>
</dependency>
<dependency>
<groupId>org.mariadb</groupId>
<artifactId>r2dbc-mariadb</artifactId>
</dependency>
<dependency>
<groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId>
</dependency>
我确定我一定遗漏了一些非常基本但不知道是什么的东西。
有什么想法吗?
我认为您的数据库 API 不能使用 Character 类型,关于它请告诉消息 No encoder for class java.lang.Character
。您是否尝试将状态字段的类型从 char 更改为 String?
性格是一种特定的类型,有惊喜。
我正在使用 Spring Reactive + MariaDB 构建 REST API。
我正在尝试存储一个用户对象。它具有这些属性。
电子邮件地址(字符串)、全名(字符串)、密码(字符串)
数据库中的等效列是:
电子邮件地址 (varchar)、全名 (varchar)、密码 (varchar)
它适用于上述字段,但是当我在我的用户对象中添加一个类型为 (private char status
) 的新字段,并在数据库中的 table 中添加一个等效列时 (status char(1)
),它失败并出现以下错误。
2021-02-14 | 18:37:51.904 | reactor-tcp-nio-2 | ERROR | o.s.b.a.w.r.e.AbstractErrorWebExceptionHandler | [0aef325c-1] 500 Server Error for HTTP POST "/users"
java.lang.IllegalArgumentException: No encoder for class java.lang.Character (parameter at index 3)
at org.mariadb.r2dbc.MariadbClientParameterizedQueryStatement.bind(MariadbClientParameterizedQueryStatement.java:93)
Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:
Error has been observed at the following site(s):
|_ checkpoint ⇢ Handler com.timesheet.timesheetapi.controller.UserController#post(User) [DispatcherHandler]
|_ checkpoint ⇢ HTTP POST "/users" [ExceptionHandlingWebHandler]
Stack trace:
at org.mariadb.r2dbc.MariadbClientParameterizedQueryStatement.bind(MariadbClientParameterizedQueryStatement.java:93)
at org.mariadb.r2dbc.MariadbClientParameterizedQueryStatement.bind(MariadbClientParameterizedQueryStatement.java:34)
...
这是我的 class:
public class User {
@Id
private long id;
private String email;
@Column("fullName")
private String fullName;
private String password;
private char status;
@Column("crDate")
private LocalDateTime crDate;
@Column("updDate")
private LocalDateTime updDate;
}
您可以忽略 crDate/updDate 字段。
这是我的 table 在 MariaDB 中的定义。
CREATE TABLE `tuser` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`email` VARCHAR(100) NULL DEFAULT NULL,
`fullName` VARCHAR(100) NULL DEFAULT NULL,
`status` CHAR(1) NOT NULL DEFAULT 'D' COMMENT 'A=Active,D=Disabled',
`password` VARCHAR(100) NULL DEFAULT NULL,
`crDate` DATETIME NULL DEFAULT current_timestamp(),
`updDate` DATETIME NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=16;
这是我的 POM 的相关部分(以防有帮助)。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-r2dbc</artifactId>
</dependency>
<dependency>
<groupId>org.mariadb</groupId>
<artifactId>r2dbc-mariadb</artifactId>
</dependency>
<dependency>
<groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId>
</dependency>
我确定我一定遗漏了一些非常基本但不知道是什么的东西。 有什么想法吗?
我认为您的数据库 API 不能使用 Character 类型,关于它请告诉消息 No encoder for class java.lang.Character
。您是否尝试将状态字段的类型从 char 更改为 String?
性格是一种特定的类型,有惊喜。