当我正在尝试打开/connect/linkedin
时,Spring无法找到html视图并且正在获取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());
}
}
我的HomeController与/linkedin
映射处理程序
@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";
}
正如我在日志中看到的那样,发生了一些事情并发现了/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社交中设置了Connection Controller
中的断点,并且调用了非映射方法。所以我认为app配置很糟糕。
修改 我错了弹簧servlet配置。我将spring社交控制器注册为root servlet。
答案 0 :(得分:2)
我认为问题在于您的观点的位置。
您在src/main/webapp
下拥有它,而春天正在src/main/resources
下搜索视图。
将所有html文件移至src/main/resources/views
或更改配置,以便在src/main/webapp/views
下搜索。
选中此Example配置与您的配置相似,但视图位于src/main/resources
文件夹下。
答案 1 :(得分:0)
我的猜测是你的application.properties文件中可能需要spring.social.auto-connection-views=true
答案 2 :(得分:-1)
我知道已经很久了,但我想我找到了解决这个问题的方法。
问题是,你的spring配置发现'ConnectController'是bean,但它没有被映射为Controller。另外,我检查了ConnectController类的来源。事实证明,它基于prefix和providerId构建了视图名称。
以下答案:https://stackoverflow.com/a/19699607/4544269
我继承了ConnectController,并覆盖了'connectView'和'connectedView',现在指向WEB-INF文件夹中的Freemarkers模板。
@Controller
public class CustomConnectController extends ConnectController{
@Autowired
public CustomConnectController(
ConnectionFactoryLocator connectionFactoryLocator,
ConnectionRepository connectionRepository) {
super(connectionFactoryLocator, connectionRepository);
}
@Override
protected String connectedView(String providerId){
return "connect/facebookConnected";
}
@Override
protected String connectView(String providerId) {
return "connect/facebookConnect";
}
}