1

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

Вот зависимости, связанные с Vaadin на нашем проекте:

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 классе

@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 ERROR возникла во время входа в систему login.org.springframework.beans.factory.BeanCreationException: ошибка при создании bean с именем 'scopedTarget.httpService': Scope 'request' неактивен для текущего потока; рассмотрите возможность определения доверенного прокси для этого компонента, если вы намерены ссылаться на него из одноэлементного; Вложенное исключение - это java.lang.IllegalStateException: не найден нисходящий запрос: вы ссылаетесь на атрибуты запроса вне фактического веб-запроса или обрабатываете запрос вне исходного потока? Если вы действительно работаете в веб-запросе и все еще получаете это сообщение, ваш код, вероятно, работает за пределами DispatcherServlet/DispatcherPortlet: в этом случае используйте RequestContextListener или RequestContextFilter, чтобы выставить текущий запрос.

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

ответ

4

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

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

+0

Благодарим за ответ Артур. Это решение работало на Vaadin 7.6.1, но в настоящее время мы используем версию 7.5.8. Мы не смогли обновить, потому что у одного из аддонов возникла проблема с 7.6. Кажется, что WEBSOCKET_XHR недоступен в 7.5.8. У вас есть какое-либо возможное решение для Vaadin 7.5.8? Еще раз спасибо за вашу помощь. – turgos

+0

LONG_POLLING также основан на HTTP, поэтому он также должен работать в 7.5. Для websockets и 7.5 вам, вероятно, потребуется инициализировать контекст Spring самостоятельно в переопределенном VaadinService.requestStart –