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 achao@apache.org
 */
@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 achao@apache.org
 */
@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解决了

相关文章
|
5月前
|
存储 NoSQL 搜索推荐
若依框架----源码分析(@RateLimiter)
若依框架----源码分析(@RateLimiter)
370 0
|
2月前
|
Java 前端开发 Apache
Apache Wicket与Spring MVC等Java Web框架大PK,究竟谁才是你的最佳拍档?点击揭秘!
【8月更文挑战第31天】在Java Web开发领域,众多框架各具特色。Apache Wicket以组件化开发和易用性脱颖而出,提高了代码的可维护性和可读性。相比之下,Spring MVC拥有强大的生态系统,但学习曲线较陡;JSF与Java EE紧密集成,但在性能和灵活性上略逊一筹;Struts2虽成熟,但在RESTful API支持上不足。选择框架时还需考虑社区支持和文档完善程度。希望本文能帮助开发者找到最适合自己的框架。
31 0
|
5月前
|
前端开发 安全 Java
Java 新手如何使用Spring MVC RestAPI的加密
Java 新手如何使用Spring MVC RestAPI的加密
|
SQL 存储 XML
SpringData进阶篇-下
SpringData进阶篇-下
126 0
|
前端开发 Java
【笑小枫的SpringBoot系列】【十】SpringBoot处理请求跨域问题
【笑小枫的SpringBoot系列】【十】SpringBoot处理请求跨域问题
110 0
|
运维 NoSQL Java
【笑小枫的SpringBoot系列】【十八】SpringBoot中的Properties配置
【笑小枫的SpringBoot系列】【十八】SpringBoot中的Properties配置
108 0
|
前端开发 Java Spring
你知道@RequestMapping的name属性有什么用吗?带你了解URI Builder模式(UriComponents/UriComponentsBuilder)【享学Spring MVC】(上)
你知道@RequestMapping的name属性有什么用吗?带你了解URI Builder模式(UriComponents/UriComponentsBuilder)【享学Spring MVC】(上)
你知道@RequestMapping的name属性有什么用吗?带你了解URI Builder模式(UriComponents/UriComponentsBuilder)【享学Spring MVC】(上)
|
Java BI Spring
【小家Spring】Spring Framework提供的实用纯Java工具类大合集(二)(中)
【小家Spring】Spring Framework提供的实用纯Java工具类大合集(二)(中)
【小家Spring】Spring Framework提供的实用纯Java工具类大合集(二)(中)
|
Java Apache 开发者
【小家Spring】Spring Framework提供的实用纯Java工具类大合集(二)(下)
【小家Spring】Spring Framework提供的实用纯Java工具类大合集(二)(下)
【小家Spring】Spring Framework提供的实用纯Java工具类大合集(二)(下)
|
前端开发 Java API
你知道@RequestMapping的name属性有什么用吗?带你了解URI Builder模式(UriComponents/UriComponentsBuilder)【享学Spring MVC】(中)
你知道@RequestMapping的name属性有什么用吗?带你了解URI Builder模式(UriComponents/UriComponentsBuilder)【享学Spring MVC】(中)