【问题标题】:Parameter 1 of constructor in required a bean of type 'org.springframework.social.connect.ConnectionRepository' that could not be found构造函数的参数 1 需要一个找不到的“org.springframework.social.connect.ConnectionRepository”类型的 bean
【发布时间】:2020-01-27 03:29:22
【问题描述】:

我正在尝试使用 Spring social 连接到 facebook。 这是我得到的错误:

Description:

Parameter 1 of constructor in Application.Facebook.FacebookController required a bean of type 'org.springframework.social.connect.ConnectionRepository' that could not be found.


Action:

Consider defining a bean of type 'org.springframework.social.connect.ConnectionRepository' in your configuration.

这是我遵循的教程:https://stackabuse.com/how-to-access-the-facebook-api-with-java-and-spring-boot/

它根本不起作用 b/c 它给了我上面提到的错误

我尝试在此处克隆 repo:https://github.com/DavidLandup/HowToAccessFacebookAPIWithSpringBoot 它不起作用

结构:

main
    +- java
       +- Application
          +- Facebook
             +- FacebookController.java
          +- Application.java

FacebookController.java

@Controller
@RequestMapping("/")
public class FacebookController {

    private Facebook facebook;
    private ConnectionRepository connectionRepository;

    public FacebookController(Facebook facebook, ConnectionRepository connectionRepository) {
        this.facebook = facebook;
        this.connectionRepository = connectionRepository;
    }

    @GetMapping
    public String helloFacebook(Model model) {
        if (connectionRepository.findPrimaryConnection(Facebook.class) == null) {
            return "redirect:/connect/fb";
        }

        model.addAttribute("facebookProfile", facebook.userOperations().getUserProfile());
        PagedList<Post> feed = facebook.feedOperations().getFeed();
        model.addAttribute("feed", feed);
        return "feed";
    }
}

Application.java

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:2.1.6.RELEASE")
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

bootJar {
    baseName = 'gs-spring-boot'
    version =  '0.1.0'
}

repositories {
    mavenCentral()
}

sourceCompatibility = 1.8
targetCompatibility = 1.8

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
    compile(
            'org.springframework.social:spring-social-core:1.1.6.RELEASE',
            'org.springframework.social:spring-social-facebook:2.0.3.RELEASE',
            'org.springframework.social:spring-social-twitter:1.1.0.RELEASE',
            'org.springframework.boot:spring-boot-starter-web',
            'org.springframework.boot:spring-boot-starter-thymeleaf'
    )
}

完整的错误信息:

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.6.RELEASE)

2019-09-26 13:20:24.043  INFO 88576 --- [           main]
2019-09-26 13:20:24.047  INFO 88576 --- [           main] Application.Application                  : No active profile set, falling back to default profiles: default
2019-09-26 13:20:25.113  INFO 88576 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2019-09-26 13:20:25.149  INFO 88576 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2019-09-26 13:20:25.149  INFO 88576 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.21]
2019-09-26 13:20:25.286  INFO 88576 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2019-09-26 13:20:25.286  INFO 88576 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1194 ms
2019-09-26 13:20:25.384  WARN 88576 --- [           main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'facebookController' defined in file [/Users/user/Social_Media_Integration/backend/out/production/classes/Application/Facebook/FacebookController.class]: Unsatisfied dependency expressed through constructor parameter 1; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.social.connect.ConnectionRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
2019-09-26 13:20:25.388  INFO 88576 --- [           main] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]
2019-09-26 13:20:25.401  INFO 88576 --- [           main] ConditionEvaluationReportLoggingListener : 

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2019-09-26 13:20:25.586 ERROR 88576 --- [           main] o.s.b.d.LoggingFailureAnalysisReporter   : 

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

Description:

Parameter 1 of constructor in Application.Facebook.FacebookController required a bean of type 'org.springframework.social.connect.ConnectionRepository' that could not be found.


Action:

Consider defining a bean of type 'org.springframework.social.connect.ConnectionRepository' in your configuration.

更新 这是完整的错误日志:

java.lang.NoSuchMethodError: org.springframework.web.util.WebUtils.extractFullFilenameFromUrlPath(Ljava/lang/String;)Ljava/lang/String;
    at org.springframework.social.connect.web.ConnectController.getPathExtension(ConnectController.java:416) ~[spring-social-web-1.1.4.RELEASE.jar:1.1.4.RELEASE]
    at org.springframework.social.connect.web.ConnectController.connectionStatusRedirect(ConnectController.java:389) ~[spring-social-web-1.1.4.RELEASE.jar:1.1.4.RELEASE]
    at org.springframework.social.connect.web.ConnectController.oauth2Callback(ConnectController.java:285) ~[spring-social-web-1.1.4.RELEASE.jar:1.1.4.RELEASE]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_181]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_181]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_181]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_181]
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) ~[spring-web-5.1.8.RELEASE.jar:5.1.8.RELEASE]
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) ~[spring-web-5.1.8.RELEASE.jar:5.1.8.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) ~[spring-webmvc-5.1.8.RELEASE.jar:5.1.8.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:892) ~[spring-webmvc-5.1.8.RELEASE.jar:5.1.8.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797) ~[spring-webmvc-5.1.8.RELEASE.jar:5.1.8.RELEASE]
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.1.8.RELEASE.jar:5.1.8.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1039) ~[spring-webmvc-5.1.8.RELEASE.jar:5.1.8.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942) ~[spring-webmvc-5.1.8.RELEASE.jar:5.1.8.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005) ~[spring-webmvc-5.1.8.RELEASE.jar:5.1.8.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:897) ~[spring-webmvc-5.1.8.RELEASE.jar:5.1.8.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:634) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882) ~[spring-webmvc-5.1.8.RELEASE.jar:5.1.8.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.21.jar:9.0.21]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) ~[spring-web-5.1.8.RELEASE.jar:5.1.8.RELEASE]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:109) ~[spring-web-5.1.8.RELEASE.jar:5.1.8.RELEASE]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
    at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:92) ~[spring-web-5.1.8.RELEASE.jar:5.1.8.RELEASE]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:109) ~[spring-web-5.1.8.RELEASE.jar:5.1.8.RELEASE]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
    at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93) ~[spring-web-5.1.8.RELEASE.jar:5.1.8.RELEASE]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:109) ~[spring-web-5.1.8.RELEASE.jar:5.1.8.RELEASE]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200) ~[spring-web-5.1.8.RELEASE.jar:5.1.8.RELEASE]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:109) ~[spring-web-5.1.8.RELEASE.jar:5.1.8.RELEASE]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.21.jar:9.0.21]
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [tomcat-embed-core-9.0.21.jar:9.0.21]
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490) [tomcat-embed-core-9.0.21.jar:9.0.21]
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) [tomcat-embed-core-9.0.21.jar:9.0.21]
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) [tomcat-embed-core-9.0.21.jar:9.0.21]
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) [tomcat-embed-core-9.0.21.jar:9.0.21]
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) [tomcat-embed-core-9.0.21.jar:9.0.21]
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408) [tomcat-embed-core-9.0.21.jar:9.0.21]
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-9.0.21.jar:9.0.21]
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:853) [tomcat-embed-core-9.0.21.jar:9.0.21]
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1587) [tomcat-embed-core-9.0.21.jar:9.0.21]
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.21.jar:9.0.21]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_181]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_181]
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.21.jar:9.0.21]
    at java.lang.Thread.run(Thread.java:748) [na:1.8.0_181]

【问题讨论】:

  • 源代码中没有ConnectionRepository

标签: java spring spring-boot


【解决方案1】:

似乎在 Spring Boot 2 中,他们从 spring-boot-autoconfigure 依赖项中删除了 FacebookAutoConfiguration 配置器,所以如果你想启用它(并使 spring setup 成为必要的 bean),你必须定义SocialConfigurer

@Configuration
public class SocialConfig implements SocialConfigurer {

    @Value("${spring.social.facebook.appId}")
    private String appId;
    @Value("${spring.social.facebook.appSecret}")
    private String appSecret;

    @Override
    public void addConnectionFactories(final ConnectionFactoryConfigurer cfConfig, final Environment env) {
        cfConfig.addConnectionFactory(new FacebookConnectionFactory(appId, appSecret));
    }

    @Override
    public UserIdSource getUserIdSource() {
        return new SessionUserIdSource();
    }

    @Override
    public UsersConnectionRepository getUsersConnectionRepository(final ConnectionFactoryLocator connectionFactoryLocator) {
        return new InMemoryUsersConnectionRepository(connectionFactoryLocator);
    }
}

并将 @EnableSocial 注释添加到您的 Application 类:

@EnableSocial
@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

这是来自 spring 的最新文档(尽管它似乎确实缺少一些信息并且包含到 Spring Social 的断开链接):

https://docs.spring.io/spring-social-facebook/docs/2.0.3.RELEASE/reference/htmlsingle/

同样在您的控制器中,您似乎正在自动装配 Facebook 对象。您的代码中某处是否有 bean 定义,或者它是在哪里创建的? 在我上面链接的官方文档中,示例 sn-p 显示了 Facebook 对象作为 FacebookTemplate 的创建,如下所示:

String accessToken = "f8FX29g..."; // access token received from Facebook after OAuth authorization
Facebook facebook = new FacebookTemplate(accessToken);

更新: 我在 github 上添加了一个测试项目。如果您在 application.properties 中填写您的 appId 和 secretId,它应该可以工作(目前,我只实现了提要列表) https://github.com/gybandi/facebooktest

更新 2: 您链接的错误日志是由较旧的 spring-social-web 依赖(来自 spring-web-starter 作为传递依赖)引起的。 尝试在您的 gradle 脚本中包含正确的 spring-social-config 依赖项:

...
dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
    compile(
            'org.springframework.social:spring-social-core:1.1.6.RELEASE',
            'org.springframework.social:spring-social-config:1.1.6.RELEASE', 
            'org.springframework.social:spring-social-facebook:2.0.3.RELEASE',
            'org.springframework.social:spring-social-twitter:1.1.0.RELEASE',
            'org.springframework.boot:spring-boot-starter-web',
            'org.springframework.boot:spring-boot-starter-thymeleaf'
    )
}
...

【讨论】:

  • 我让一切都运行了,但是当我尝试加载 fb 页面时,它给了我这个错误:java.lang.NoSuchMethodError: org.springframework.web.util.WebUtils.extractFullFilenameFromUrlPath(Ljava/lang/String;) 做一些研究,似乎这种方法在春季 4.3.2 中已被弃用,确实这意味着我必须将我的 spring-boot 版本恢复为旧版本,或者有解决方法吗?
  • 这很奇怪。什么叫那个方法?你能粘贴堆栈跟踪吗?我使用了 2.1.8.RELEASE spring boot starter parent(它有 spring 5.1.9.RELEASE)和你一样的社交/facebook 依赖,但我没有遇到这个问题
  • 抱歉回复晚了,我已将完整的错误日志添加到上面的描述中
猜你喜欢
  • 2022-11-29
  • 2019-10-20
  • 2020-10-17
  • 2019-03-21
  • 1970-01-01
  • 2020-02-23
  • 2021-02-02
  • 1970-01-01
  • 2023-02-05
相关资源
最近更新 更多