vv0885 2024-02-11 12:26 采纳率: 0%
浏览 11
已结题

OpenFeign在UserDetailsService中调用不成功

OpenFeign,通过SpringSecurity的UserDetailsService实现类中的loadUserByUsername方法内,不能调用成功;在通过Controller的调用时是成功的
UserDetailsService实现类代码

@Service
public class MyUserDetailsService implements UserDetailsService {
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        Object user = userClient.login(username);
        ......
    }
    @Resource
    private UserClient userClient;
}

UserClient代码

@FeignClient(name = "user-service-provider", fallback = UserClientFallback.class)
public interface UserClient {
    @GetMapping("/login/username/{username}")
    Object login(@PathVariable String username);
}

UserClientFallback代码

public class UserClientFallback implements MSUserClient {
    @Override
    public Object login(String username) {
        return "Error";
    }
}

开源包版本信息

<properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <spring.cloud.alibaba.version>2022.0.0.0</spring.cloud.alibaba.version>
        <spring.cloud.version>4.0.0</spring.cloud.version>
    </properties>
......
<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>4.0.0</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
......
  • 写回答

17条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-02-11 12:26
    关注
    获得0.60元问题酬金

    引自免费微信小程序:皆我百晓生

    在Spring Boot项目中,您尝试通过UserDetailsService实现类使用OpenFeign调用远程服务。根据您提供的信息,问题在于在MyUserDetailsServiceloadUserByUsername方法内无法成功调用UserClient的接口方法。

    首先,请确认以下排查步骤:

    1. 启动依赖的服务: 确保“user-service-provider”服务已经启动并且其 /login/username/{username} 端点可以正常响应请求。

    2. OpenFeign配置正确性: 虽然您没有提供全局的OpenFeign配置,但请确保您的application.ymlapplication.properties文件中有正确的服务发现配置(例如Eureka、Consul或者Nacos),使得OpenFeign能够找到并连接到“user-service-provider”。

    3. 安全上下文与生命周期: Spring Security的UserDetailsService通常在Security框架初始化期间被调用,此时可能由于Spring容器还未完全初始化完成,导致注入的UserClient实例尚未准备好。您需要确保在Security相关组件初始化之后再进行依赖注入。

    4. 检查日志: 查看应用启动日志,寻找有关OpenFeign客户端初始化失败或调用失败的相关错误信息。

    5. 开启Feign的日志打印: 为了更好地调试问题,可以通过添加如下配置来开启Feign的日志输出,以便查看详细的请求和响应情况:

      feign:
        client:
          config:
            default:
              loggerLevel: FULL # 或 BASIC
      
    6. 事务管理: 如果loadUserByUsername方法内部涉及事务管理,而OpenFeign调用时可能导致事务传播不正确,请检查事务配置。

    针对可能的问题,一种解决方案是在MyUserDetailsService类上添加@Lazy注解以延迟加载该bean,确保在OpenFeign客户端初始化完成后才执行注入:

    @Service
    public class MyUserDetailsService implements UserDetailsService {
        @Lazy
        @Resource
        private UserClient userClient;
    
        @Override
        public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
            Object user = userClient.login(username);
            // ...
        }
    }
    

    然而,通常情况下,将远程服务调用放在UserDetailsService中并不是最佳实践,因为这可能会增加系统的复杂性和耦合度。建议您考虑将此类逻辑移动到一个独立的服务层,并在Controller或其他适合的地方调用。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 2月19日
  • 创建了问题 2月11日

悬赏问题

  • ¥50 swiftui @query 报错
  • ¥50 怎么解决刷卡或扫码后,点击软件输入框,win10屏幕键盘不会自动弹出的问题
  • ¥15 如何使用arcgispro的训练深度模型,发现water和nowater精度为0?(相关搜索:深度学习)
  • ¥20 matlab作业不太懂呀有问题能给个代码吗
  • ¥15 自制电路图为何无法驱动ESP01S?
  • ¥15 前端加access数据库
  • ¥15 ARCGIS 多值提取到点 ERROR 999999
  • ¥15 mysql异常断电, [MY-011971] [InnoDB]
  • ¥15 uni.onBluetoothDeviceFound熄屏不运行
  • ¥15 求PHDA糖尿病并发症数据集,有偿