Ваадин Спринг Безопасность

Я работал с примером, который нашел, вот ссылка на репозиторий Git:

https://github.com/basakpie/vaadin8-spring-security-sample

Он отлично работает, это как раз то, что мне нужно, за исключением одного: мне нужен Server Push.

Вот что я сделал до сих пор:

  • добавлена ​​зависимость Vaadin Push
  • добавил следующие строки в начало метода MainUI.init():

    getPushConfiguration().setTransport(Transport.WEBSOCKET);
    getPushConfiguration().setPushMode(PushMode.AUTOMATIC);
    
  • В класс MainUI добавлены следующие поля:

    Label time = new Label();
    Timer timer;
    
  • В класс MainUI добавлен следующий метод:

    private void updateTime() {
      access(() -> time.setValue(String.format("The server-side time is %s",  LocalTime.now().format(DateTimeFormatter.ofPattern("HH:mm:ss")))));
    }
    
  • Наконец, в конец метода MainUI.init() добавлено следующее:

    timer = new Timer();
    timer.schedule(new TimerTask() {
        @Override
        public void run() {
            updateTime();
        }
    }, 1000L, 1000L);
    

В основном это работает. Я могу видеть, как текущее системное время обновляется каждую секунду. Но когда я нажимаю «Обновить» в браузере, приложение просто зависает с загрузчиком vaadin. Сообщений об ошибках нет.

Я пробовал следующие альтернативы:

Добавление метода

public void attach() {
    getPushConfiguration().setTransport(Transport.WEBSOCKET);
    getPushConfiguration().setPushMode(PushMode.AUTOMATIC);
}

и удаление getPushConfiguration строк из init()

Это решает проблему зависания, но пуш не работает - никаких ошибок, просто время вообще не отображается.

Я также попытался добавить аннотацию @Push к MainUI. Это приводит к тому же поведению, что и раньше — зависанию при обновлении.

Как я могу это исправить? Любые предложения будут приветствоваться.


person NickJ    schedule 31.08.2017    source источник


Ответы (2)


Попробуйте следующую процедуру:

  1. Добавьте @Push в файл MainUI.java.

    @Push(transport = Transport.WEBSOCKET,value = PushMode.AUTOMATIC)

  2. Вместо :

    getPushConfiguration().setTransport(Transport.WEBSOCKET); getPushConfiguration().setPushMode(PushMode.AUTOMATIC);

  3. Добавьте @PreDestroy для выхода из таймера при переходе из основного пользовательского интерфейса.

    @PreDestroy void destroy() { timer.cancel(); }

Полный пересмотренный код находится ЗДЕСЬ

https://gist.github.com/cansoftinc/351452ee0e616d353519f147c4a961ba

person Dun0523    schedule 06.09.2017
comment
Спасибо за чаевые. К сожалению, я вижу такое же поведение :( - person NickJ; 08.09.2017

У меня была точно такая же проблема, и моим решением было реализовать сервлет vaadin. Проверьте здесь для получения дополнительной информации.

person gkatzioura    schedule 14.02.2018