使用Spring Boot的Vaadin Dashboard演示

时间:2015-10-02 17:45:40

标签: spring-boot vaadin demo

我尝试使用Vaadin + Spring Boot组合一个简单的应用程序,只有两个视图:登录和仪表板。我正在使用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,我希望容器能够解决这个问题。 但我无法弄清楚如何让Spring注入视图。

3 个答案:

答案 0 :(得分:1)

使用@VaadinUIScope@VaadinComponent为您的观点添加注释。然后,您可以使用@Autowired注入视图。

答案 1 :(得分: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),只有在用户登录后才能注册主导航器和模块视图关于资源。

答案 2 :(得分:0)

注意:看一下这个例子,看起来他们实际上并没有使用视图&amp;导航员,他们有点假装他们。如果您想继续使用相同的路径,您只需在UI中自动装配虚假视图,而不是使用下面的导航器。

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

1)@SpringUI使用自动装配的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
    }
});