spring - 重写 Spring-Social ConnectController 并添加拦截器

标签 spring spring-mvc twitter spring-social

我有一个使用 Spring Social 的网络应用程序。

我有一个按钮可以按照文档中的示例将登录用户连接到 Twitter(发布到/connect/twitter),并且我的用户可以连接到 Twitter 帐户并获取所有常用帐户信息/ token 等。

但是,我想在连接到 Twitter 帐户后覆盖 Spring-Social 的默认行为(在这种情况下,我不想必须实现默认 View ,我希望成功/失败将用户引导回正常主页并将提供信息等)。所以我重写了 ConnectController,一切都很好:

@Controller
@RequestMapping("/connect")
public class ConnectController extends org.springframework.social.connect.web.ConnectController {

    @Inject
    public ConnectController(ConnectionFactoryLocator connectionFactoryLocator, ConnectionRepository connectionRepository) {
        super(connectionFactoryLocator, connectionRepository);
    }

    @Override
    protected String connectedView(String providerId) {
        return "redirect:/";
    }

}

我连接到 Twitter,我的重写 ConnectController 接管并将用户重定向到主页,而不是尝试查找相关 View 。

但是,我现在还想提供一个拦截器,在连接后自动进行进一步的 API 调用以获取更多数据 - 并遵循此处的示例:http://docs.spring.io/spring-social/docs/1.0.x/reference/htmlsingle/#connect-interceptors我创建了一个拦截器:

public class TwitterConnectionInterceptor implements ConnectInterceptor<Twitter> {

    @Autowired TwitterService twitterService;

    @Override
    public void preConnect(ConnectionFactory<Twitter> connectionFactory, MultiValueMap<String, String> parameters, WebRequest request) { }

    @Override
    public void postConnect(Connection<Twitter> connection, WebRequest request) {
        twitterService.importTwiterDetails();
    }
}

按照上面链接的文档,我还更新了我的配置以将拦截器显式添加到我的 ConnectController:

@Bean public TwitterConnectionInterceptor twitterConnectionInterceptor(){
    return new TwitterConnectionInterceptor();
}

@Bean public ConnectController connectController() {
    com.tmm.frm.spring.social.ConnectController controller = new com.tmm.frm.spring.social.ConnectController(connectionFactoryLocator(),
        connectionRepository());
    controller.addInterceptor(twitterConnectionInterceptor());
    return controller;
}

但是,当我连接到 Twitter 时,拦截器没有触发(调试它,拦截器没有在我的 Controller 上注册)。我想这可能是因为我的 ConnectController 类具有 @Controller 注释并且位于我在启动时扫描的包之一中,但是,我尝试将该 Controller 移出扫描的包并将其保留给我的显式 bean 配置,但它根本没有注册,而且我没有得到自定义重定向。

任何人都可以告诉我如何覆盖 Controller 并添加拦截器或者我可能做错了什么?

最佳答案

尝试注入(inject)拦截器,然后在@PostConstruct阶段添加拦截器?

@Controller
@RequestMapping("/connect")
public class ConnectController extends org.springframework.social.connect.web.ConnectController {

    private TwitterConnectionInterceptor twitterConnInterceptor ;

    @Inject
    public ConnectController(ConnectionFactoryLocator connectionFactoryLocator, ConnectionRepository connectionRepository,TwitterConnectionInterceptor twitterConnInterceptor) {
        super(connectionFactoryLocator, connectionRepository);
        this.twitterConnInterceptor = twitterConnInterceptor; 
    }

    @PostConstruct
    public void addInterceptor(){
       this.addInterceptor(twitterConnInterceptor);
    }

    @Override
    protected String connectedView(String providerId) {
        return "redirect:/";
    }

}

好吧,不太理想,但应该可以。

关于spring - 重写 Spring-Social ConnectController 并添加拦截器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19915819/

相关文章:

java - 如何将带有 mongoDB 项目的 spring 4 + Hibernate 切换到 MySQL?

xcode - 为 iOS 客户端寻找 OAuth 版本的 Twitter 代码

java - 如何使用多个@Transactional 注解的方法?

java - Spring Boot 和 Drools 集成

java - Spring 依赖项没有被注入(inject)到 BeforeSuite 方法中?

android - 如何在 android 中从 Facebook 获取用户电子邮件 ID、用户名

c# - 解析来自 Twitter 的具有多个详细信息的 Json 数据

spring - 为具有复合 ID 的实体自定义 HATEOAS 链接生成

java - 使用 spring.config.location 命令行参数时,为 Spring 的 @PropertySource 设置什么?

java - 测试中未抛出 MaxUploadSizeExceededException