2016-05-25 5 views
3

Весна не может найти html-представления и им получать 404, пока я пытаюсь открыть /connect/linkedin. В рефери до that post Я дважды проверил свои пути в папке webapp. Вот мой SpringSocialConfigSpring Social/connect return HTTP 404

@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"; 
} 

И моя WebAPP папка с видом enter image description here

Как я вижу в журналах, что-то произошло, и были обнаружены /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; 
    } 

я установить точки останова в Connection Controller от Spring социальной и Безоперационная отображенной метода был вызван. Поэтому я думаю, что конфигурация приложения беспорядочна.

EDIT У меня была неправильная конфигурация весеннего сервлета. Я зарегистрировал весенние социальные контроллеры как корневой сервлет.

+0

Эй, @ Якуб, можете ли вы попытаться установить «уровень отладочного журнала» для 'spring controller'? log4j.logger.controller = DEBUG, console – oak

+0

Вы могли бы создать простой проект на GitHub для репликации этой ошибки? Вам будет легче помочь. – Mithun

ответ

0

Я думаю, что вам может понадобиться spring.social.auto-connection-views=true в вашем application.properties файл

+0

У меня нет приложения.properties Файл вообще.Im использует Spring MVC, а не Boot. –

+0

«перенаправление:/connect/linkedin» в общем случае перенаправляет на эти представления, если установлено значение «Истина», если у вас нет этого флага, я думаю, вам нужно предоставить свой собственный вид для подключения или каким-то образом установить этот флаг в true (Я не являюсь пользователем Spring MVC, поэтому не могу помочь) – mklimasz

+0

довольно уверен, что вам просто нужно предоставить свой собственный просмотр для перенаправления на ваш социальный медиа для входа в систему, так как это перенаправление вроде этого не должно работать (оно должно работать только при загрузке с флаг, который предоставляет некоторые скрытые виды и конфигурации). – mklimasz

2

Я думаю, что проблема является расположением ваших взглядов.

У вас оно под src/main/webapp, а весна ищет виды под src/main/resources.

Либо переместите все ваши html-файлы в src/main/resources/views или измените конфигурацию так, чтобы весна искала под src/main/webapp/views.

Проверьте это Example Конфигурация похожа на то, что у вас есть, но виды находятся под src/main/resources папкой.

-1

Я знаю, что прошло много времени, но я думаю, что нашел решение этой проблемы.

Проблема заключается в том, что ваша конфигурация пружины обнаружила «ConnectController» как bean-компонент, но не была отображена как Controller. Кроме того, я проверил источник класса ConnectController. Оказалось, что он создает имена имен на основе префикса и providerId.

После этого ответа: https://stackoverflow.com/a/19699607/4544269

Я унаследовал ConnectController, и перекрытая как 'connectView' и 'connectedView', теперь указывает на шаблоны Freemarkers в папку WEB-INF.

@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"; 
    } 

    }