我尝试使用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注入视图。
答案 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
}
});