На сервере ресурсов SpringBoot 3 OAuth2 отсутствует компонент типа «org.springframework.security.oauth2.jwt.JwtDecoder»

Я создал приложение с Spring-boot-starter-oauth2-resource-server в pom.xml и значением для Spring.security.oauth2.resourceserver.jwt.issuer-uri в application.properties . Он работает нормально, когда я запускаю его в первый раз. Затем я добавил класс @Service с внедренным org.springframework.security.oauth2.jwt.JwtDecoder, как показано ниже.

      @Slf4j
@Service
public class MyService {

    private final JwtDecoder jwtDecoder;
    private final WebClient webClient;

    public MyService(
            JwtDecoder jwtDecoder,
            WebClient webClient
    ) {
        this.jwtDecoder = jwtDecoder;
        this.webClient = webClient;
    }

    // method definitions

}

При запуске выдает ошибку

Параметр 0 конструктора в MyService требовал bean-компонента типа org.springframework.security.oauth2.jwt.JwtDecoder, который не удалось найти.

Когда я удаляю инъекцию, все снова работает нормально.

Что я должен делать?

2 ответа

В отдельном классе конфигурации вам, возможно, придется добавить bean-компонент для декодера jwt следующим образом:

      @Bean
public JwtDecoder jwtDecoder(OAuth2ResourceServerProperties properties) {
    return JwtDecoders.fromIssuerLocation(properties.getJwt().getIssuerUri());
}

Импорт свойств будет следующим:

      import org.springframework.boot.autoconfigure.security.oauth2.resource.OAuth2ResourceServerProperties;

Где находится фактическое внедрение зависимостей? и где он пытается получить значение из свойств вашего приложения? или вы рассчитываете на автонастройку? пожалуйста, покажите весь поток вашего кода, похоже, что какой-то его части не хватает. Как Spring boot узнает, откуда взять декодер? вам следует убедиться, что соответствующий bean-компонент доступен в контексте приложения, а затем использовать аннотацию @Autowired или использовать @RequiredArgsConstructor, поскольку вы используете lombok.

Другие вопросы по тегам