dromara / lamp-cloud

lamp-cloud 支持jdk21、jdk17、jdk11、jdk8,ta基于 SpringCloud + SpringBoot 开发的微服务中后台快速开发平台,专注于多租户(SaaS架构)解决方案,亦可作为普通项目(非SaaS架构)的基础开发框架使用,目前已实现插拔式数据库隔离、SCHEMA隔离、字段隔离 等租户隔离方案。
http://tangyh.top
Apache License 2.0
5.5k stars 1.68k forks source link

跨服务回显org时如果在redis中无相应key value将直接往redis插入key,null键值对,导致回显错误 #225

Closed pinkcao closed 1 year ago

pinkcao commented 1 year ago

版本信息:

JDK 版本(必填) : 11 源码版本(必填):lamp-cloud-pro-datasource-column 4.12.3 MySQL(必填): 8.0.11 Nacos(必填):2.0.2

问题描述:

跨服务回显org时如果在redis中无相应key value将直接往redis插入key,null键值对,导致回显错误

报错截图

图片

重现步骤

1.flush redis

  1. 将EchoController中的findOrgByIds修改为 图片

3.在其他服务的resultVO实体中增加orgId的@Echo注解 图片

4.前端登录

5.前端直接进行pageQuery,跨服务回显(有echoService.action) 图片

6.打印部分如报错截图部分,不知为何在map有相应值的情况下,却无法get到

7.再次flush redis

8.再次前端登录

9.同服务间echo(查询用户) 图片

可以从map中获取相应value

请问是可能哪里出了问题

zuihou commented 1 year ago

意思是跨服务回显不行,本服务回显可以吗?

都是用的 OrgApi 吗?

pinkcao commented 1 year ago

是的,跨服务回显在redis原始为空的情况下会失败,插入cacheKey, null,本服务之间可以成功回显。 跨服务调用时是走的top.tangyh.lamp.common.api.OrgApi,从echoController调到了orgManager.findByIds(ids); 本服务调用时是直接调了baseOrgManagerImpl.findByIds(ids)

zuihou commented 1 year ago

好,我试试

zuihou commented 1 year ago
  1. EchoController 调用 BaseOrgService 的方法
  2. 在 BaseOrgService 和 BaseOrgServiceImpl 新建 findByIds
  3. BaseOrgServiceImpl 中,将ids做一下类型转换
    @Override
    public Map<Serializable, Object> findByIds(Set<Serializable> ids) {
        return superManager.findByIds(ids.stream().map(Convert::toLong).collect(Collectors.toSet()));
    }

原因: feign 调用时,会将Set 中的泛型擦除,导致原本是Long类型的变成了String类型的。

所以,远程回显时,需要自己转一下类型。