Vaadin @Push с Vaadin4Spring Security

Кто-нибудь использует Vaadin @Push с расширением vaadin-spring-boot-starter и расширением Vaadin4Spring Security?

Вот зависимости Ваадина от нашего проекта:

  compile 'com.vaadin:vaadin-client-compiled:7.5.8'
  compile 'com.vaadin:vaadin-client:7.5.8'
  compile 'com.vaadin:vaadin-themes:7.5.8'
  compile 'com.vaadin:vaadin-server:7.5.8'
  compile 'com.vaadin:vaadin-push:7.5.8'

  // Official VaadinSpring Integration
  compile("com.vaadin:vaadin-spring-boot-starter:1.0.0")

  //Vaadin extentions - in the future more of those will go to official VaadinSpring Integration
  compile("org.vaadin.spring.extensions:vaadin-spring-ext-security:0.0.6.RELEASE")
  compile("org.vaadin.spring.extensions:vaadin-spring-ext-core:0.0.6.RELEASE")
  compile("org.vaadin.spring.extensions:vaadin-spring-ext-boot:0.0.6.RELEASE")
  compile("org.vaadin.spring.extensions:vaadin-spring-ext-test:0.0.6.RELEASE")

Вот аннотации на UI Class

@Theme("mytheme")
@Title(com.test.util.Constants.TITLE)
@EnableOAuth2Client
@SpringUI
@Push
public class MyVaadinUI extends UI {
...
}

И, Application.java;

@EnableVaadinExtensions
@SpringBootApplication
@EnableConfigurationProperties
@EnableI18N
@EnableEventBus
@RestController
@EnableOAuth2Client
public class Application extends SpringBootServletInitializer {
  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }

  @Override
  protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    return application.sources(Application.class);
  }

  @Bean 
  public RequestContextListener requestContextListener(){
    return new RequestContextListener();
  } 

  @Bean
  public FilterRegistrationBean hiddenHttpMethodFilter() {
    HiddenHttpMethodFilter hiddenHttpMethodFilter = new HiddenHttpMethodFilter();
    FilterRegistrationBean registrationBean = new FilterRegistrationBean();
    registrationBean.setFilter(hiddenHttpMethodFilter);
    return registrationBean;
  }

  @Bean(name = "messageSource")
  public ResourceBundleMessageSource messageSource() {
    ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
    messageSource.setBasename("messages/messages");
    logger.debug("Returning messageSource: " + ((messageSource != null) ? messageSource.toString() : "NULL"));
    return messageSource;
  }

}

Как только мы вызываем security.login(username.getValue(), password.getValue()); (безопасность - это org.vaadin.spring.security.VaadinSecurity;)

мы получаем следующее исключение;

16: 36: 35.272 [http-nio-8080-exec-9] ОШИБКА cbgcsvviews.login.LoginBox/login Ошибка входа в систему во время login.org.springframework.beans.factory.BeanCreationException: Ошибка создания компонента с именем scopedTarget.httpService.: Scope 'request' не активен для текущего потока; рассмотрите возможность определения прокси-объекта с областью видимости для этого компонента, если вы намереваетесь ссылаться на него из синглтона; Вложенное исключение - java.lang.IllegalStateException: не найден привязанный к потоку запрос: Вы ссылаетесь на атрибуты запроса вне фактического веб-запроса или обрабатываете запрос вне первоначально получающего потока? Если вы на самом деле работаете с веб-запросом и по-прежнему получаете это сообщение, ваш код, вероятно, выполняется за пределами DispatcherServlet/DispatcherPortlet: в этом случае используйте RequestContextListener или RequestContextFilter для предоставления текущего запроса.

Я ценю любую помощь, которую вы можете оказать.

1 ответ

Решение

Вы используете веб-сокеты, которые не используют запросы сервлетов и не будут автоматически активировать область запроса.

Если вы используете @Push(transport=WEBSOCKET_XHR), это должно сработать, так как канал websockets будет использоваться только для сообщений сервера -> клиента, а стандартные сообщения HTTP будут использоваться для сообщений клиента -> сервера.

Другие вопросы по тегам