Spring Boot 的 R2DBC 错误:无法对“io.r2dbc.spi.Parameters$InParameter”类型的值进行编码

问题描述 投票:0回答:1

我正在使用 Spring Boot 3R2DBC 开发一项服务,将数据上传到 MySQL 8.0 数据库。这样做时,我在尝试绑定参数时遇到以下错误:

reactor.core.Exceptions$ErrorCallbackNotImplemented: java.lang.IllegalArgumentException: Cannot encode value of type 'class io.r2dbc.spi.Parameters$InParameter'

Maven 依赖项

<?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(不支持)或直接用+“”+(不支持)连接此字符串,则会发生不同的问题

java spring-boot spring-webflux project-reactor r2dbc
1个回答
0
投票

更改此依赖关系

    <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 看到了类似的问题。我也遇到过这个错误并同样修复了它。

© www.soinside.com 2019 - 2024. All rights reserved.