应用程序启动失败-需要找不到类型的bean

时间:2018-07-21 05:11:25

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

我刚刚下载了项目:

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

我启动了该项目,它可以正常运行。此基本项目的主要功能是使用Facebook验证用户身份并获取其供稿。

在此项目中有文件:

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 }

谢谢!

1 个答案:

答案 0 :(得分:1)

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

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

因此,当删除该Java类时,将删除该应用程序使用的Spring bean的定义,因此它无法以“ Missing bean”错误开头。

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