Skip to main content
 首页 » 编程设计

Spring Social/connect 返回 HTTP 404

2025年12月25日31mfrbuaa

当我尝试打开 /connect/linkedin 时,Spring 无法找到 html View 并且我得到 404。引用that post我仔细检查了 webapp 文件夹中的路径。这是我的 SpringSocialConfig

@Configuration 
@EnableSocial 
public class SocialConfig implements SocialConfigurer { 
 
    @Inject 
    private DataSource dataSource; 
 
    @Override 
    public void addConnectionFactories(ConnectionFactoryConfigurer connectionFactoryConfigurer, Environment environment) { 
        connectionFactoryConfigurer.addConnectionFactory(new LinkedInConnectionFactory("xxxxxx", "xxxxxx")); 
    } 
 
    @Override 
    public UserIdSource getUserIdSource() { 
        return new UserIdSource() { 
            @Override 
            public String getUserId() { 
                Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); 
                if (authentication == null) { 
                    throw new IllegalStateException("Unable to get a ConnectionRepository: no user signed in"); 
                } 
                return authentication.getName(); 
            } 
        }; 
    } 
 
    @Bean 
    public ConnectController connectController(ConnectionFactoryLocator connectionFactoryLocator, ConnectionRepository connectionRepository) { 
        return new ConnectController(connectionFactoryLocator, connectionRepository); 
    } 
 
 
    @Bean 
    @Scope(value = "request", proxyMode = ScopedProxyMode.INTERFACES) 
    public LinkedIn linkedin(ConnectionRepository repository) { 
        Connection<LinkedIn> connection = repository.findPrimaryConnection(LinkedIn.class); 
        return connection != null ? connection.getApi() : null; 
    } 
 
    @Override 
    public UsersConnectionRepository getUsersConnectionRepository(ConnectionFactoryLocator connectionFactoryLocator) { 
        return new JdbcUsersConnectionRepository(dataSource, connectionFactoryLocator, Encryptors.noOpText()); 
    } 
} 

带有 /linkedin 映射处理程序的我的 HomeController

@Inject 
private ConnectionRepository connectionRepository; 
 
@Inject 
private LinkedIn linkedIn; 
 
@Inject 
public HomeController(LinkedIn linkedIn) { 
    this.linkedIn = linkedIn; 
} 
 
@RequestMapping(value = "/linkedin", method = RequestMethod.GET) 
public String home(Principal currentUser, Model model) { 
    Connection<LinkedIn> connection = connectionRepository.findPrimaryConnection(LinkedIn.class); 
    if (connection == null) { 
        return "redirect:/connect/linkedin"; 
    } 
    model.addAttribute("profile", connection.getApi().profileOperations().getUserProfileFull()); 
    return "linkedin/profile"; 
} 

还有我的带有 View 的 WEBAPP 文件夹

正如我在日志中看到的那样,发生了一些事情并且发现了 /connect/* 映射。

[localhost-startStop-1] INFO org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - Mapped "{[/connect/{providerId}],methods=[POST]}" onto public org.springframework.web.servlet.view.RedirectView org.springframework.social.connect.web.ConnectController.connect(java.lang.String,org.springframework.web.context.request.NativeWebRequest) 
[localhost-startStop-1] INFO org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - Mapped "{[/connect/{providerId}],methods=[GET]}" onto public java.lang.String org.springframework.social.connect.web.ConnectController.connectionStatus(java.lang.String,org.springframework.web.context.request.NativeWebRequest,org.springframework.ui.Model) 
[localhost-startStop-1] INFO org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - Mapped "{[/connect],methods=[GET]}" onto public java.lang.String org.springframework.social.connect.web.ConnectController.connectionStatus(org.springframework.web.context.request.NativeWebRequest,org.springframework.ui.Model) 
[localhost-startStop-1] INFO org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - Mapped "{[/connect/{providerId}],methods=[GET],params=[oauth_token]}" onto public org.springframework.web.servlet.view.RedirectView org.springframework.social.connect.web.ConnectController.oauth1Callback(java.lang.String,org.springframework.web.context.request.NativeWebRequest) 
[localhost-startStop-1] INFO org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - Mapped "{[/connect/{providerId}],methods=[GET],params=[code]}" onto public org.springframework.web.servlet.view.RedirectView org.springframework.social.connect.web.ConnectController.oauth2Callback(java.lang.String,org.springframework.web.context.request.NativeWebRequest) 
[localhost-startStop-1] INFO org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - Mapped "{[/connect/{providerId}],methods=[GET],params=[error]}" onto public org.springframework.web.servlet.view.RedirectView org.springframework.social.connect.web.ConnectController.oauth2ErrorCallback(java.lang.String,java.lang.String,java.lang.String,java.lang.String,org.springframework.web.context.request.NativeWebRequest) 
[localhost-startStop-1] INFO org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - Mapped "{[/connect/{providerId}],methods=[DELETE]}" onto public org.springframework.web.servlet.view.RedirectView org.springframework.social.connect.web.ConnectController.removeConnections(java.lang.String,org.springframework.web.context.request.NativeWebRequest) 
[localhost-startStop-1] INFO org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - Mapped "{[/connect/{providerId}/{providerUserId}],methods=[DELETE]}" onto public org.springframework.web.servlet.view.RedirectView org.springframework.social.connect.web.ConnectController.removeConnection(java.lang.String,java.lang.String,org.springframework.web.context.request.NativeWebRequest) 
[local 

我正在使用 Thymeleaf 3.0

@Bean 
public ViewResolver viewResolver() { 
    ThymeleafViewResolver resolver = new ThymeleafViewResolver(); 
    resolver.setTemplateEngine(templateEngine()); 
    resolver.setCharacterEncoding("UTF-8"); 
    resolver.setContentType("text/html; charset=UTF-8"); 
    return resolver; 
} 
 
@Bean 
public TemplateEngine templateEngine() { 
    SpringTemplateEngine engine = new SpringTemplateEngine(); 
    engine.setEnableSpringELCompiler(true); 
    engine.setTemplateResolver(templateResolver()); 
    engine.addDialect(new SpringSecurityDialect()); 
    return engine; 
} 
 
 private ITemplateResolver templateResolver() { 
        SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver(); 
        resolver.setApplicationContext(applicationContext); 
        resolver.setPrefix("/views/"); 
        resolver.setSuffix(".html"); 
        resolver.setTemplateMode(TemplateMode.HTML); 
        resolver.setCharacterEncoding("UTF-8"); 
        resolver.setCacheable(Boolean.parseBoolean(THYMELEAF_CACHE)); 
        return resolver; 
    } 

调度程序配置

public class WebAppInitializer implements WebApplicationInitializer { 
 
    private final String APP_SERVLET_NAME = "x"; 
    private final String DISPLAY_NAME = "App"; 
 
    @Override 
    public void onStartup(ServletContext container) { 
        container.addListener(new ContextLoaderListener(getContext())); 
        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter(); 
        characterEncodingFilter.setEncoding("utf-8"); 
        characterEncodingFilter.setForceEncoding(true); 
 
        container.addFilter("charEncodingFilter", characterEncodingFilter).addMappingForUrlPatterns(null, false, "/*"); 
        container.addFilter("securityFilter", new DelegatingFilterProxy("springSecurityFilterChain")).addMappingForUrlPatterns(null, false, "/*"); 
        container.addFilter("apiFilter", new DelegatingFilterProxy("apiExceptionHandler")); 
        container.addFilter("hidden", new HiddenHttpMethodFilter()); 
 
        AnnotationConfigWebApplicationContext dispatcherServlet = new AnnotationConfigWebApplicationContext(); 
        dispatcherServlet.register(ServletConfig.class); 
 
        ServletRegistration.Dynamic dispatcher = container.addServlet(APP_SERVLET_NAME, new DispatcherServlet(dispatcherServlet)); 
        dispatcher.setLoadOnStartup(1); 
        dispatcher.addMapping("/"); 
    } 
 
    private AnnotationConfigWebApplicationContext getContext() { 
        AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext(); 
        rootContext.register(JPARepositoryConfig.class, 
                ThymeleafConfig.class, 
                WebSecurityConfig.class, 
                SocialConfig.class, 
                MailConfig.class, 
                MongoRepositoryConfig.class, 
                ServiceConfig.class, 
                CacheConfig.class); 
 
        rootContext.setDisplayName(DISPLAY_NAME); 
        return rootContext; 
    } 

我在 Spring Social 的 Connection Controller 中设置了断点,并且没有调用映射方法。所以我认为应用配置一团糟。

编辑 我有错误的 spring servlet 配置。我将 spring 社交 Controller 注册为根 servlet。

请您参考如下方法:

我认为问题在于您的观点所在的位置。

你有它在 src/main/webapp 下spring 正在搜索 src/main/resources 下的 View .

要么将所有 html 文件移动到 src/main/resources/views或更改配置,以便 spring 在 src/main/webapp/views 下搜索.

检查这个Example配置与您所拥有的类似,但 View 在 src/main/resources 下文件夹。