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解决了

相关文章
|
6月前
|
XML 编解码 Java
我为什么放弃Spring Boot 中的 RestTemplate?选择 Retrofit
我为什么放弃Spring Boot 中的 RestTemplate?选择 Retrofit
102 0
|
18天前
|
Java 测试技术 API
弃用 RestTemplate,来了解一下官方推荐的 WebClient !
在 Spring Framework 5.0 及更高版本中,RestTemplate 已被弃用,取而代之的是 WebClient。WebClient 提供了非阻塞 I/O、函数式编程风格、更好的错误处理和流式传输支持等优势。本文介绍了如何在 Spring Boot 3 中使用 WebClient 发送同步和异步请求,并处理各种错误。虽然 RestTemplate 仍可用于某些场景,但 WebClient 是现代 Spring 应用程序的更好选择。
弃用 RestTemplate,来了解一下官方推荐的 WebClient !
|
5月前
|
Java
springboot封装RedisTemplate
springboot封装RedisTemplate
|
JSON Java 数据格式
SpringBoot 实战:在 RequestBody 中优雅的使用枚举参数(原理篇)
在优雅的使用枚举参数(原理篇)中我们聊过,Spring对于不同的参数形式,会采用不同的处理类处理参数,这种形式,有些类似于策略模式。
635 0
SpringBoot 实战:在 RequestBody 中优雅的使用枚举参数(原理篇)
|
前端开发 Java
【笑小枫的SpringBoot系列】【十】SpringBoot处理请求跨域问题
【笑小枫的SpringBoot系列】【十】SpringBoot处理请求跨域问题
119 0
|
Java 网络架构 Spring
[Java Framework] [Spring] Spring中RestTemplate中几种常见的请求方式
> - RestTemple是Spring提供的用于访问Http请求的客户端,RestTemple提供了多种简洁的远程访问服务的方法,省去了很多无用的代码。 >- RestTemplate的行为可以通过callback回调方法和配置HttpMessageConverter 来定制,用来把对象封装到HTTP请求体,将响应信息放到一个对象中。 >- 考虑到了RestTemplate类是为了调用REST服务而设计的,因此它的主要方法与REST的基础紧密相连就不足为奇了,后者时HTTP协议的方法:HEAD、GET、POST、PUT、DELETE、OPTIONS例如,RestTemplate类具有hea
242 0
[Java Framework] [Spring] Spring中RestTemplate中几种常见的请求方式
|
开发框架 Java Spring
Springboot @Autowired 和 @Resource 我的剖析,你看完就不会忘
Springboot @Autowired 和 @Resource 我的剖析,你看完就不会忘
435 0
Springboot @Autowired 和 @Resource 我的剖析,你看完就不会忘
|
缓存 Java Spring
玩转Spring Cache --- @Cacheable/@CachePut/@CacheEvict注解的原理深度剖析和使用【享学Spring】(上)
玩转Spring Cache --- @Cacheable/@CachePut/@CacheEvict注解的原理深度剖析和使用【享学Spring】(上)
玩转Spring Cache --- @Cacheable/@CachePut/@CacheEvict注解的原理深度剖析和使用【享学Spring】(上)
|
设计模式 缓存 Java
玩转Spring Cache --- @Cacheable/@CachePut/@CacheEvict注解的原理深度剖析和使用【享学Spring】(中)
玩转Spring Cache --- @Cacheable/@CachePut/@CacheEvict注解的原理深度剖析和使用【享学Spring】(中)
玩转Spring Cache --- @Cacheable/@CachePut/@CacheEvict注解的原理深度剖析和使用【享学Spring】(中)