Spring Social - 是否可能,如果可以,如何重写 ConnectController 中的方法?

标签 spring spring-social

我想要实现的目标是,在没有可用 session 的情况下尝试连接到服务提供商时,首先创建一个,然后创建一个,因为我的客户端不是浏览器,而是 HttpClient 我希望 connectionStatus 方法返回 json 而不是 html?

我尝试直接从 ConnectController 扩展,但我怀疑幕后发生了很多事情,所以不太清楚错误到底告诉我什么:

  @Controller
@RequestMapping("/connect")
public class MyConnectController extends ConnectController {

    @Inject
    public MyConnectController(
            ConnectionFactoryLocator connectionFactoryLocator,
            ConnectionRepository connectionRepository) {
        super(connectionFactoryLocator, connectionRepository);
        // TODO Auto-generated constructor stub
    }

    @RequestMapping(value = "/{providerId}", method = RequestMethod.GET)
    public String get(@PathVariable String providerId, NativeWebRequest request) {
        return "I'll return a json string here, OK?";
    }

    @Override
    @RequestMapping(value = "/{providerId}", method = RequestMethod.POST)
    public RedirectView connect(@PathVariable String providerId,
            NativeWebRequest request) {
        System.out.println("I'll create a new session here, OK?");
        return super.connect(providerId, request);
    }
}

和错误堆栈跟踪:

    SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerMapping' defined in class path resource [org/springframework/web/servlet/config/annotation/DelegatingWebMvcConfiguration.class]: Invocation of init method failed; nested exception is java.lang.IllegalStateException: Ambiguous mapping found. Cannot map 'myConnectController' bean method 
public java.lang.String org.springframework.social.connect.web.ConnectController.connectionStatus(java.lang.String,org.springframework.web.context.request.NativeWebRequest,org.springframework.ui.Model)
to {[/connect/{providerId}],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}: There is already 'myConnectController' bean method
public org.springframework.web.servlet.view.RedirectView com.buzz.social.connect.MyConnectController.get(java.lang.String,org.springframework.web.context.request.NativeWebRequest) mapped.
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1486)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:524)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:461)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:626)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:389)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:294)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4797)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5291)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:680)
Caused by: java.lang.IllegalStateException: Ambiguous mapping found. Cannot map 'myConnectController' bean method 
public java.lang.String org.springframework.social.connect.web.ConnectController.connectionStatus(java.lang.String,org.springframework.web.context.request.NativeWebRequest,org.springframework.ui.Model)
to {[/connect/{providerId}],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}: There is already 'myConnectController' bean method
public org.springframework.web.servlet.view.RedirectView com.buzz.social.connect.MyConnectController.get(java.lang.String,org.springframework.web.context.request.NativeWebRequest) mapped.
    at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.registerHandlerMethod(AbstractHandlerMethodMapping.java:171)
    at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.detectHandlerMethods(AbstractHandlerMethodMapping.java:145)
    at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.initHandlerMethods(AbstractHandlerMethodMapping.java:107)
    at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.afterPropertiesSet(AbstractHandlerMethodMapping.java:87)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping.afterPropertiesSet(RequestMappingHandlerMapping.java:163)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1545)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1483)
    ... 22 more

最佳答案

问题的原因是在 ConnectController已经有 connectionStatus 方法,其映射与您的 get(...) 方法完全相同:

@RequestMapping(value="/{providerId}", method=RequestMethod.GET)
public String connectionStatus(@PathVariable String providerId, NativeWebRequest request, Model model) {
    ....
}

get(...) 方法的映射更改为不同的值以防止冲突。

关于Spring Social - 是否可能,如果可以,如何重写 ConnectController 中的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17934729/

相关文章:

java - Spring @PathVariable 作为一年

spring - 如何在 Gradle 构建脚本中加载 .yml 属性?

java - 如何创建多部分响应

java - Spring 记得我没有使用自定义过滤器和 Java 配置

java - 为什么 Spring Social Authentication 是 NULL?

java - 通过 Spring Social 获取完整 Linkedin 个人资料时出现 400 错误请求错误

Spring Social/connect 返回 HTTP 404

spring - 是否可以将 Spring HATEOAS WebFluxLinkBuilders 与 Kotlin 协程一起使用?

Java 配置到 XML 配置 - Spring Social

java - 使用字段选择器获取 linkedin 个人资料