webflux之webclient踩坑tablefield

简介: webflux之webclient踩坑tablefield

任难任之事,要有力而无气;处难处之人,要有知而无言。——金缨

今天踩坑发现使用webclient发起请求


import com.alibaba.nacos.common.utils.JacksonUtils;
import org.dromara.streamquery.stream.core.collection.Lists;
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;

import java.util.List;
import java.util.Objects;

/**
 * MallClient
 *
 * @author [email protected]
 */
@Service
public class MallClient {

    private final WebClient webClient;

    public MallClient(WebClient.Builder webClientBuilder) {
        this.webClient = webClientBuilder.baseUrl("http://mall-service/").build();
    }

    public Mono<Boolean> incrementPointsByUserId(List<UserAccountDTO> accounts) {
        accounts.removeIf(account -> Objects.isNull(account.getPointsNum()) ||
                Objects.equals(account.getPointsNum(), 0L));
        if (Lists.isEmpty(accounts)) {
            return Mono.empty();
        }
        return webClient.post()
                .uri("/foo")
                .bodyValue(JacksonUtils.toJson(bar))
                .retrieve().bodyToMono(String.class)
                .map(str -> {
                    var node = JacksonUtils.toObj(str);
                    if (!JsonUtils.isResOk(node)) {
                        throw new ApiServerException("incrementPointsByUserId failed");
                    }
                    return true;
                })
                .doOnError(Throwable::printStackTrace);
    }

}

然后是调用代码:

import jakarta.annotation.Resource;
import org.dromara.streamquery.stream.core.collection.Lists;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import reactor.test.StepVerifier;

/**
 * MallClientTest
 *
 * @author [email protected]
 */
@SpringBootTest
class MallClientTest {

    @Resource
    private MallClient mallClient;

    @Test
    void incrementPointsByUserIdTest() {
        var userAccount = new UserAccountDTO();
        userAccount.setUserId(9052710354240385086L);
        userAccount.setPointsNum(100L);
        userAccount.setPointSceneType(PointSceneType.WORD_CHAIN);
        StepVerifier.create(mallClient.incrementPointsByUserId(
                        Lists.of(userAccount)))
                .expectNextMatches(result -> result.equals(true))
                .expectComplete()
                .verify();
    }

}

发现调用一直抛出java.lang.NoClassDefFoundError说是mybatisorg.apache.ibatis.type.JdbcType找不到…

最后排查发现UserAccountDTO里有个字段加了注解com.baomidou.mybatisplus.annotation.TableField

而我在webflux项目中默认使用的

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <scope>provided</scope>
</dependency>

最后去掉TableField解决了

相关文章
|
分布式计算 Java 数据库连接
了解Spring R2DBC的声明式事务实现机制
# Spring非反应式事务实现原理 Spring基于注解和AOP的声明式事务(@Transactional)已经是业务开发的常用工具,默认是采用同步的方式基于ThreadLocal(保存连接信息和会话信息等)实现,在具体数据库操作时就使用同一个数据库连接,并手动提交事务,保证数据正确性。 # 基于反应式的Spring事务有何不同 Spring的反应式实现是基于Reactor框架,该框架
3057 0
|
网络协议 Linux
nmcli命令详解
【4月更文挑战第9天】`nmcli`是Red Hat 7及CentOS 7后的网络管理命令,用于配置网卡并持久化设置。它可以显示网络连接信息(如`connection show`、`dev status`),控制网卡状态(启用、停用、删除连接),以及修改配置(如IP地址、DNS)。其他功能包括检查NetworkManager状态、开关网络连接和查看系统网络状态。要了解全部详情和高级用法,建议查阅相关文档。
1542 1
|
API 开发工具 数据库
开发一份API接口,需要注意这些,看你做到了几项
本文介绍了设计API接口时需注意的关键点,包括数字签名、敏感数据加密与脱敏、限流、参数校验、统一返回与异常处理、请求日志记录、幂等设计、数据量限制、异步处理、参数定义、完整文档及开发者对接SDK等内容,旨在帮助开发者设计出安全、稳定、易维护的API接口。
481 6
开发一份API接口,需要注意这些,看你做到了几项
|
负载均衡
webclient负载均衡踩坑
webclient负载均衡踩坑
435 0
java线程池执行任务(一次任务、固定间隔时间任务等)
java线程池执行任务(一次任务、固定间隔时间任务等)
661 1
|
人工智能 Java
通过okhttp调用SSE流式接口,并将消息返回给客户端
通过okhttp调用SSE流式接口,并将消息返回给客户端
vue : 无法将“vue”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。
vue : 无法将“vue”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。
|
Dubbo Java 应用服务中间件
DUBBO--基础篇(一)--简介(示意Demo)
DUBBO--基础篇(一)--简介(示意Demo)
683 0
|
Java Maven
Maven标准目录结构介绍
src/main/java:源代码目录 src/main/resources:资源文件目录 src/test/java:测试代码目录 src/test/resources:测试资源文件目录 这里只是部分结构,像jar或者war工程如果有源代码的一般是这个结构,但这个结构也不是必须的,不同的项目不同的需求也可以有不同的结构。
911 0
Maven标准目录结构介绍
|
数据可视化 JavaScript API
vue2+datav可视化数据大屏(2)
接上一节所说 我们已经讲骨架搭好 这节我们讲述的如何在vue2中使用mock数据和封装axios
691 0