java - 应用程序无法启动 - 无法找到所需类型的 bean

标签 java spring facebook spring-boot spring-security-oauth2

我刚刚下载了该项目:

https://github.com/habuma/facebook-security5

我启动了该项目并且它运行正常。这个基本项目的主要功能是通过 Facebook 验证用户身份并获取他的 feed。

该项目内有文件:

https://github.com/habuma/facebook-security5/blob/master/src/main/java/sample/SocialConfig.java

内容如下:

package sample;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.oauth2.client.OAuth2AuthorizedClient;
import org.springframework.security.oauth2.client.OAuth2AuthorizedClientService;
import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken;
import org.springframework.web.context.annotation.RequestScope;

import sample.api.facebook.Facebook;

@Configuration
public class SocialConfig {

    @Bean
    @RequestScope
    public Facebook facebook(OAuth2AuthorizedClientService clientService) {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        String accessToken = null;
        if (authentication.getClass().isAssignableFrom(OAuth2AuthenticationToken.class)) {
            OAuth2AuthenticationToken oauthToken = (OAuth2AuthenticationToken) authentication;
            String clientRegistrationId = oauthToken.getAuthorizedClientRegistrationId();
            if (clientRegistrationId.equals("facebook")) {
                OAuth2AuthorizedClient client = clientService.loadAuthorizedClient(clientRegistrationId, oauthToken.getName());
                accessToken = client.getAccessToken().getTokenValue();
            }
        }
        return new Facebook(accessToken);
    }

}

我注意到没有对该类的引用:SocialConfig

我的问题是:为什么当我删除这个未引用的类时,当我尝试运行应用程序时,会收到以下错误?

***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 0 of constructor in sample.HomeController required a bean of type 'sample.api.facebook.Facebook' that could not be found.


Action:

Consider defining a bean of type 'sample.api.facebook.Facebook' in your configuration.

注释有什么含义:{ @Configuration, @Bean, @RequestScope }

谢谢!

最佳答案

我认为你需要阅读 Spring 中基于注释的配置:

  • @Configuration 注释一个 Java 类,该类定义要由应用程序使用的 Spring bean - 有点像应用程序上下文 XML 文件,但采用 Java 类的形式。
  • @Bean 注释一个定义应用程序要使用的 Spring bean 的方法。该方法返回的值将是新的 Spring bean,并且方法名称将用于派生该 bean 的名称。

因此,当您删除该 Java 类时,您就删除了应用程序使用的 Spring bean 的定义,因此它无法启动并出现“Missing bean”错误。

@RequestScope 注释描述了有关 bean 生命周期的一些内容 - 我认为这意味着 Spring 将为它处理的每个 HTTP 请求自动创建该 bean 的一个新实例。

关于java - 应用程序无法启动 - 无法找到所需类型的 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51453009/

相关文章:

php - Facebook Graph API 共同好友

java - 无法正确解析日期 00 :00:00 and 23:59:59 EST in Java

java - Java中什么是Null

java - 启动多语言子进程时出现 Storm 错误

java - 如何创建容错JobStep

iOS Facebook URL 方案无法在 Facebook 应用程序中打开页面

java - 使用 Speedment Streams 进行异步回调

java - Spring security kerberos 适用于 xml 配置,但不适用于 Java 配置

java - Spring MVC Rest 服务 - 线程数( Controller 实例)

swift - Facebook Swift SDK 登录不会打开 native 对话框