首页 文章

使用Spring Boot的Vaadin Dashboard演示

提问于
浏览
2

我'm trying to put together a simple application using Vaadin + Spring Boot with just two views: login and dashboard. I'使用了Vaadin Dashboard demo中的代码片段 . DashboardUI 类中有此方法:

private void updateContent() {
    User user = (User) VaadinSession.getCurrent().getAttribute(
            User.class.getName());
    if (user != null && "admin".equals(user.getRole())) {
        // Authenticated user
        setContent(new MainView());
        removeStyleName("loginview");
        getNavigator().navigateTo(getNavigator().getState());
    } else {
        setContent(new LoginView());
        addStyleName("loginview");
    }
}

如您所见,视图通过 new 关键字进行实例化 . 因为我正在使用Spring,所以我希望容器能够解决这个问题 . But I cannot figure out how to have the views injected by Spring.

3 回答

  • 1

    使用 @VaadinUIScope@VaadinComponent 注释您的视图 . 然后你可以使用 @Autowired 来注入你的视图 .

  • 1

    您应该设置两个UI类,即LoginUI.class和MainUI.class . 将Spring Security重定向到 /login 并授权给 /

    LoginUI.class

    @Theme("valo")
    @SpringUI(path = "login")
    @PreserveOnRefresh 
    public class LoginUI extends UI {
    
       private SpringViewProvider viewProvider;
    
       @Autowired
       public LoginUI(SpringViewProvider viewProvider) {
          this.viewProvider = viewProvider;
       }
    
       @Override
       protected void init(VaadinRequest request) {
          Navigator navigator = new Navigator(this, this);
          navigator.addProvider(viewProvider);
          navigator.navigateTo(LoginView.VIEW_NAME);
       }
    
    }
    

    MainAppUI.class

    @Theme("valo")
    @SpringUI
    @PreserveOnRefresh
    public class MainAppUI extends UI {
    
        private SpringViewProvider viewProvider;
    
        @Autowired
        public AppUI(SpringViewProvider viewProvider) {
           this.viewProvider = viewProvider;
        }
    
        @Override
        protected void init(VaadinRequest request) {
    
            getPage().setTitle("Main App");
    
            setSizeFull();
    
            Navigator navigator = new Navigator(this, viewDisplay);
            navigator.addProvider(viewProvider);
    
            setContent();//viewport
    
           navigator.navigateTo(DashboardView.VIEW_NAME);
        }
    }
    

    然后根据Morfic的建议,在您的应用程序的模块视图上使用@SpringView(name =“moduleOne”,ui = MainAppUI.class),只有在用户登录后才能注册主导航器和模块视图以节省资源 .

  • 0

    注意:看一下这个例子,他们似乎有点伪造它们 . 如果您想继续使用相同的路径,您只需在UI中自动装配虚假视图,而不是使用下面的导航器 .

    Vaadin-spring boot wiki通过使用以下内容对此进行了介绍:

    1) @SpringUI with autowired SpringViewProvider

    @Theme("valo")
    @SpringUI
    public class MyVaadinUI extends UI {
    
        // we can use either constructor autowiring or field autowiring
        @Autowired
        private SpringViewProvider viewProvider;
    
        @Override
        protected void init(VaadinRequest request) {
            // other init stuff
            Navigator navigator = new Navigator(this, viewContainer);
            navigator.addProvider(viewProvider);
        }
    }
    

    2) @SpringView

    @SpringView(name = DefaultView.VIEW_NAME)
    public class DefaultView extends VerticalLayout implements View {
        public static final String VIEW_NAME = "";
    
        @PostConstruct
        void init() {
            addComponent(new Label("This is the default view"));
        }
    
        @Override
        public void enter(ViewChangeEvent event) {
            // the view is constructed in the init() method()
        }
    }
    

    对于是否应该将用户重定向到登录视图或其他用户的决定,我通常使用 ViewChangeListener ,类似于:

    navigator.addViewChangeListener(new ViewChangeListener() {
        @Override
        public boolean beforeViewChange(ViewChangeEvent event) {
            if (VaadinSession.getCurrent().getAttribute("user") == null) {
                navigator.getDisplay().showView(loginView);
                return false;
            } else {
                return true;
            }
        }
    
        @Override
        public void afterViewChange(ViewChangeEvent event) {
            // meh
        }
    });
    

相关问题