【问题标题】:What's wrong with my spring-social ConnectController?我的 spring-social ConnectController 有什么问题?
【发布时间】:2016-05-13 08:16:35
【问题描述】:

我正在尝试制作一个 Spring Boot 应用程序,该应用程序将使用 spring-social 连接到 Fitbit 的 api。我已经(中途)实现了一个ConnectionFactory,它是 Fitbit 的依赖项,我正在尝试从我的应用程序中使用它。其中一部分涉及启动ConnectController 来处理OAuth2“舞蹈”。

当我尝试通过浏览器在http://localhost:8080/connecthttp://localhost:8080/connect/fitbit 上点击ConnectController 时,我会被重定向到带有以下消息的可白标错误页面:

出现意外错误(类型=不允许的方法,状态=405)。

不支持请求方法“GET”

我不太明白我看到了什么,但是当我设置 DEBUG 级别日志记录并使用一些断点时,看起来就像从浏览器中点击 /connect 会导致 Spring 试图找到名为 connect/status 的东西并且点击/connect/fitbit 导致spring 试图找到名为/connect/fitbitConnect 的东西,然后尝试在内部向/connect/connect/fitbitConnect 发出GET 请求。

在这两种情况下,看起来ConnectController 上对应于/connect/connect/{providerId} 的方法都被调用得很好,然后Spring 在寻找所有其他东西时会爆炸。

这是我正在使用的SocialConfigurer 实现,它创建了ConnectController bean:

@Configuration
@EnableSocial
@PropertySource("${properties.path}/fitbot-service.properties")
public class SpringSocialConfig implements SocialConfigurer{
    @Override
    public void addConnectionFactories(ConnectionFactoryConfigurer connectionFactoryConfigurer, Environment environment) {
        connectionFactoryConfigurer.addConnectionFactory(new FitbitConnectionFactory(
                environment.getProperty("fitbit.clientId"),
                environment.getProperty("fitbit.clientSecret")
        ));
    }

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

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

    @Bean
    public ConnectController connectController(ConnectionFactoryLocator connectionFactoryLocator, ConnectionRepository connectionRepository) {
        return new ConnectController(connectionFactoryLocator, connectionRepository);
    }

}

这里到底发生了什么?我究竟做错了什么?

【问题讨论】:

    标签: spring-mvc oauth oauth-2.0 spring-boot spring-social


    【解决方案1】:

    我相信这与您关于 ConnectController 中的 GET 与 POST 的问题有关,因此您可能已经自己回答了这个问题。尽管如此,让我澄清一下它为什么要寻找 connect/status 和 connect/fitbitConnect。

    这些是视图名称。当您为 /connect 执行 GET 时,您要求 ConnectController 获取所有提供者的连接状态并将其放置在模型中,之后它将将该模型转发到逻辑名称为“connect/status”的视图。通常这是路径“/connect/status.jsp”中的 JSP,或者可能是“/connect/status.html”中的 Thymeleaf 模板,但它可以是任何遵循 Spring MVC 视图解析器规则的视图。

    同样,对 /connect/fitbit 的 GET 请求要求 ConnectController 获取“fitbit”提供程序的连接状态,并将该信息放入模型中并将其转发到名称为“/connect/fitbitConnect”的视图(如果没有连接)或“/connect/fitbitConnected”(如果有连接)。

    除了回答您的问题,我还可以要求您详细介绍一下您的 FitBit Spring Social 提供商项目吗?它是否以其他社区主导的 Spring Social 项目为蓝本?换句话说,它是其他人可能使用的 Spring Social 的独立扩展吗?如果是这样,请告诉我它在 GitHub 中的位置,我很乐意将其添加到 http://projects.spring.io/spring-social/ 的“社区项目”部分。

    【讨论】:

    • (1 of 2) 感谢您也查看此问题。对此,我真的非常感激。我会考虑添加这些视图。关于应用程序:我是 Target 的一名顾问,他们让我们进行创新冲刺。我团队中的每个人都参加了 fitbit 计步比赛,我们希望获得有关由 hubot 倾倒到 hipchat 中的排名的信息。 Spring-social-fitbit 是我模仿其他 spring-social 项目的尝试。 Target 可能会让我们发布源代码(这是我们的目标),但我认为它不会很有用
    • (2 of 2) 我认为我们的 spring-social-fitbit 不会是一个有用的贡献,原因如下:(1) 我们只构建了足够的功能来获取步骤信息, (2)我几乎不知道我在做什么,(3)我们可能不会完成。话虽如此,我发现这些东西非常有趣,我会考虑将其作为社区项目进行分叉/重新启动。如果我能为 Spring 做出实质性贡献并真正深入研究 OAuth 的东西,那将是最酷的事情。
    猜你喜欢
    • 2013-11-02
    • 2016-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-18
    • 2019-05-17
    • 1970-01-01
    • 2012-11-06
    相关资源
    最近更新 更多