覆盖Spring-Social ConnectController并添加Interceptor

时间:2013-11-11 20:58:48

标签: spring spring-mvc twitter spring-social

我有一个使用Spring Social的webapp。

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

但是,我想在连接到Twitter帐户后覆盖Spring-Social的默认行为(在这种情况下,我不想实现默认视图,我希望成功/失败将用户引导回正常的主页,并将提供信息等)。所以我已经覆盖了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调用以获取更多数据 - 并按照此处的示例进行操作: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时,拦截器没有触发(调试它,拦截器没有在我的控制器上注册)。我想也许这是因为我的ConnectController类有@Controller注释,并且在我在启动时扫描的其中一个包中,但是,我尝试将该控制器从扫描的包中移出并离开它是我的显式bean配置,但它根本没有注册,我没有得到我的自定义重定向。

任何人都可以建议我如何覆盖控制器并添加拦截器或我可能做错了什么?

2 个答案:

答案 0 :(得分:1)

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

}

好不理想,但应该工作。

答案 1 :(得分:1)

我在这里登陆时遇到了同样的问题,但不喜欢接受的解决方案。在看了代码之后,我发现创建一个用@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) {

    }
}

注意:此解决方案在我第一次没有用,因为当我实现ConnectInterceptor接口时,我没有指定泛型类型<Facebook>。没有它就行不了。

编辑:如果要更改属性而不是添加拦截器,可以使用Post Bean Processor