2015-10-02 73 views
2

我試圖用一個簡單的應用程序使用Vaadin + Spring Boot只有兩個視圖:登錄和儀表板。我正在使用來自Vaadin Dashboard demo的代碼段。目前這種方法在DashboardUI類:Vaadin儀表板演示使用春季啓動

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

:考慮看看這個例子看來,他們實際上並沒有使用意見&航海家,他們有些方法僞造。如果您想繼續使用相同的路徑,只需在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 
    } 
}); 
+0

這不是我想繼續他們這樣做的方式。什麼是更好的選擇?我將如何使用導航器進行操作?是否有可能擁有一個導航器並在這兩個視圖之間導航,然後在用戶登錄時使用它在儀表板內導航? –

+0

任何方法都是有效的,最終它取決於你需要/想要做的事情。看一看Vaadin書中提供的[導航器背後的推理](https://vaadin.com/book/vaadin7//page/advanced.navigator.html),考慮一下你的想法,然後決定走哪條路。 – Morfic

1

標註與@VaadinUIScope@VaadinComponent你的看法。然後你可以使用@Autowired來注入你的觀點。

1

您應該設置兩個UI類,即LoginUI.class和MainUI.class。有春季安全重定向擅自/登錄並授權/

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); 
    } 
} 

那麼就使用@SpringView( name =「moduleOne」,ui = MainAppUI.class)在您的模塊視圖中爲您的應用程序建議由Morfic提供,只有在用戶登錄後才能註冊主導航器和模塊視圖以節省資源。

+0

這是一個有趣的方法。感謝您的建議。 –