我正在使用 Spring Boot 3 和 R2DBC 开发一项服务,将数据上传到 MySQL 8.0 数据库。这样做时,我在尝试绑定参数时遇到以下错误:
reactor.core.Exceptions$ErrorCallbackNotImplemented: java.lang.IllegalArgumentException: Cannot encode value of type 'class io.r2dbc.spi.Parameters$InParameter'
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.koishi.web.discord</groupId>
<artifactId>DiscordBotProject</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>DiscordBotProject</name>
<description>DiscordBotProject</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.5</version> <!-- 使用当前版本 -->
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.12.5</version> <!-- 使用与你的jackson版本相同的版本 -->
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.discord4j</groupId>
<artifactId>discord4j-core</artifactId>
<version>3.2.5</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-r2dbc</artifactId>
<version>3.1.3</version>
</dependency>
<dependency>
<groupId>dev.miku</groupId>
<artifactId>r2dbc-mysql</artifactId>
<version>0.8.2.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
reactor.core.Exceptions$ErrorCallbackNotImplemented: java.lang.IllegalArgumentException: Cannot encode value of type 'class io.r2dbc.spi.Parameters$InParameter'
Caused by: java.lang.IllegalArgumentException: Cannot encode value of type 'class io.r2dbc.spi.Parameters$InParameter'
at dev.miku.r2dbc.mysql.codec.DefaultCodecs.encode(DefaultCodecs.java:178) ~[r2dbc-mysql-0.8.2.RELEASE.jar:0.8.2.RELEASE]
at dev.miku.r2dbc.mysql.ParametrizedStatementSupport.bind(ParametrizedStatementSupport.java:72) ~[r2dbc-mysql-0.8.2.RELEASE.jar:0.8.2.RELEASE]
at dev.miku.r2dbc.mysql.ParametrizedStatementSupport.bind(ParametrizedStatementSupport.java:39) ~[r2dbc-mysql-0.8.2.RELEASE.jar:0.8.2.RELEASE]
at org.springframework.r2dbc.core.DefaultDatabaseClient$StatementWrapper.bind(DefaultDatabaseClient.java:556) ~[spring-r2dbc-6.0.11.jar:6.0.11]
at org.springframework.r2dbc.core.binding.IndexedBindMarkers$IndexedBindMarker.bind(IndexedBindMarkers.java:86) ~[spring-r2dbc-6.0.11.jar:6.0.11]
at org.springframework.r2dbc.core.NamedParameterUtils$ExpandedQuery.bind(NamedParameterUtils.java:540) ~[spring-r2dbc-6.0.11.jar:6.0.11]
at org.springframework.r2dbc.core.NamedParameterUtils$ExpandedQuery.bindTo(NamedParameterUtils.java:589) ~[spring-r2dbc-6.0.11.jar:6.0.11]
at org.springframework.r2dbc.core.DefaultDatabaseClient$DefaultGenericExecuteSpec.lambda$getResultFunction$5(DefaultDatabaseClient.java:378) ~[spring-r2dbc-6.0.11.jar:6.0.11]
at org.springframework.r2dbc.core.ResultFunction.apply(ResultFunction.java:64) ~[spring-r2dbc-6.0.11.jar:6.0.11]
at org.springframework.r2dbc.core.ResultFunction.apply(ResultFunction.java:42) ~[spring-r2dbc-6.0.11.jar:6.0.11]
at org.springframework.r2dbc.core.DefaultDatabaseClient.sumRowsUpdated(DefaultDatabaseClient.java:195) ~[spring-r2dbc-6.0.11.jar:6.0.11]
at org.springframework.r2dbc.core.DefaultDatabaseClient$DefaultGenericExecuteSpec.lambda$execute$6(DefaultDatabaseClient.java:403) ~[spring-r2dbc-6.0.11.jar:6.0.11]
at org.springframework.r2dbc.core.DelegateConnectionFunction.apply(DelegateConnectionFunction.java:48) ~[spring-r2dbc-6.0.11.jar:6.0.11]
at org.springframework.r2dbc.core.DelegateConnectionFunction.apply(DelegateConnectionFunction.java:33) ~[spring-r2dbc-6.0.11.jar:6.0.11]
at org.springframework.r2dbc.core.DefaultDatabaseClient.lambda$inConnection$2(DefaultDatabaseClient.java:120) ~[spring-r2dbc-6.0.11.jar:6.0.11]
at io.r2dbc.pool.MonoDiscardOnCancel$MonoDiscardOnCancelSubscriber.onNext(MonoDiscardOnCancel.java:92) ~[r2dbc-pool-1.0.1.RELEASE.jar:1.0.1.RELEASE]
at io.r2dbc.pool.MonoDiscardOnCancel.subscribe(MonoDiscardOnCancel.java:50) ~[r2dbc-pool-1.0.1.RELEASE.jar:1.0.1.RELEASE]
at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:165) ~[reactor-core-3.5.9.jar:3.5.9]
at reactor.pool.AbstractPool$Borrower.deliver(AbstractPool.java:467) ~[reactor-pool-1.0.1.jar:1.0.1]
at reactor.pool.SimpleDequePool.lambda$drainLoop$9(SimpleDequePool.java:425) ~[reactor-pool-1.0.1.jar:1.0.1]
at dev.miku.r2dbc.mysql.util.DiscardOnCancelSubscriber.onComplete(DiscardOnCancelSubscriber.java:104) ~[r2dbc-mysql-0.8.2.RELEASE.jar:0.8.2.RELEASE]
at dev.miku.r2dbc.mysql.client.ReactorNettyClient$ResponseSink.next(ReactorNettyClient.java:340) ~[r2dbc-mysql-0.8.2.RELEASE.jar:0.8.2.RELEASE]
at dev.miku.r2dbc.mysql.client.ReactorNettyClient.lambda$new$0(ReactorNettyClient.java:103) ~[r2dbc-mysql-0.8.2.RELEASE.jar:0.8.2.RELEASE]
at dev.miku.r2dbc.mysql.client.MessageDuplexCodec.handleDecoded(MessageDuplexCodec.java:187) ~[r2dbc-mysql-0.8.2.RELEASE.jar:0.8.2.RELEASE]
at dev.miku.r2dbc.mysql.client.MessageDuplexCodec.channelRead(MessageDuplexCodec.java:95) ~[r2dbc-mysql-0.8.2.RELEASE.jar:0.8.2.RELEASE]
public Mono<MessageKeywords> createKeyword(String keyword) {
return databaseClient.sql("INSERT INTO message_keywords (Keyword) VALUES (:keyword)" )
.bind("keyword", keyword)
.fetch()
.rowsUpdated()
.map(rowsUpdated -> new MessageKeywords(keyword));
}
@Table("message_keywords")
public class MessageKeywords {
@Id
private Long keywordId;
private String keyword;
@Override
public String toString() {
return "MessageKeywords{" +
"keywordId=" + keywordId +
", keyword='" + keyword + '\'' +
'}';
}
}
//getters and setters are ignored
CREATE TABLE message_keywords (
keywordId BIGINT PRIMARY KEY AUTO_INCREMENT,
keyword JSON
);
对于这个问题你有什么想法吗?或者像r2dbc这样的reactor支持的mysql驱动程序的替代品?如果您发布,我将非常感激!
我尝试调试它,但是,我在google中找不到任何相关信息。如果我使用索引绑定到sql(不支持)或直接用+“”+(不支持)连接此字符串,则会发生不同的问题
更改此依赖关系
<dependency>
<groupId>dev.miku</groupId>
<artifactId>r2dbc-mysql</artifactId>
<version>0.8.2.RELEASE</version>
</dependency>
进入
<dependency>
<groupId>io.asyncer</groupId>
<artifactId>r2dbc-mysql</artifactId>
<version>1.1.3</version>
</dependency>
我们为什么要这样做?
由于您使用的是高于3.0的Spring版本,请根据您的Spring版本查看这里需要使用的库版本。
我还在 github here 看到了类似的问题。我也遇到过这个错误并同样修复了它。