重写Spring Social ConnectController并添加拦截器

重写Spring Social ConnectController并添加拦截器,spring,spring-mvc,twitter,spring-social,Spring,Spring Mvc,Twitter,Spring Social,我有一个使用Spring Social的Web应用程序 我有一个按钮将登录用户连接到Twitter,如文档中的示例所示(发布到/connect/Twitter),我的用户可以连接到Twitter帐户并获取所有常用的帐户信息/令牌等 但是,我想在Spring Social连接到twitter帐户后覆盖它的默认行为(在这种情况下,我不想实现默认视图,我希望成功/失败将用户引导回正常主页并提供信息等)。所以我重写了ConnectController,一切都很好: @Controller @Reques

我有一个使用Spring Social的Web应用程序

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

但是,我想在Spring Social连接到twitter帐户后覆盖它的默认行为(在这种情况下,我不想实现默认视图,我希望成功/失败将用户引导回正常主页并提供信息等)。所以我重写了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接管并将用户重定向到主页,而不是试图查找相关视图

但是,我现在还想提供一个拦截器,在连接后自动进行进一步的API调用以获取更多的数据,下面的示例是:我创建了一个拦截器:

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();
    }
}
但是,当我连接到Twitter时,拦截器没有启动(调试它时,拦截器没有在我的控制器上注册)。我想这可能是因为我的
ConnectController
类有
@Controller
注释,并且在启动时扫描的一个包中,我曾尝试将该控制器移出扫描包,并将其留给我的显式bean配置,但它根本没有注册,我也没有得到自定义重定向


有人能告诉我如何覆盖控制器并添加拦截器,或者我可能做错了什么吗?

尝试注入拦截器,然后在
@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:/";
    }

}

好的,不太理想,但应该可以

我刚到这里时也有同样的问题,但不喜欢公认的解决方案。在查看代码之后,我发现创建一个带有
@Component
注释的bean就足够了,拦截器将自动添加

因此,我的解决办法是:

@Component
public class MyFacebookConnectInterceptor implements ConnectInterceptor<Facebook>{

    @Override
    public void preConnect(ConnectionFactory connectionFactory, MultiValueMap multiValueMap, WebRequest webRequest) {

    }

    @Override
    public void postConnect(Connection connection, WebRequest webRequest) {

    }
}
@组件
公共类MyFaceBookConnectionInterceptor实现了ConnectionInterceptor{
@凌驾
public void预连接(ConnectionFactory ConnectionFactory、MultiValueMap MultiValueMap、WebRequest WebRequest){
}
@凌驾
公共无效后连接(连接连接,WebRequest WebRequest){
}
}
注意:这个解决方案在第一次对我不起作用,因为当我实现
ConnectInterceptor
接口时,我没有指定泛型类型
。没有它就不行

编辑:如果您想更改比添加拦截器更多的属性,可以使用
postbeanprocessor

@Component
public class MyFacebookConnectInterceptor implements ConnectInterceptor<Facebook>{

    @Override
    public void preConnect(ConnectionFactory connectionFactory, MultiValueMap multiValueMap, WebRequest webRequest) {

    }

    @Override
    public void postConnect(Connection connection, WebRequest webRequest) {

    }
}