2016-01-13 51 views
3

我想實現我的vaadin申請春季意見,但我得到我的SpringViewProvider的NPE(「不能添加空視圖提供」)。這是我的代碼:SpringViewProvider春季UI的Vaadin

@SpringUI(path = "permalink") 
@Theme("myTheme") 
public class PermalinkUI extends UI { 

@Autowired 
private SpringViewProvider springViewProvider; 

private Navigator navigator; 

@Override 
protected void init(VaadinRequest request) { 

    final VerticalLayout root = new VerticalLayout(); 
    root.setSizeFull(); 
    root.setMargin(true); 
    root.setSpacing(true); 
    setContent(root); 

    final Panel viewContainer = new Panel(); 
    viewContainer.setSizeFull(); 
    root.addComponent(viewContainer); 
    root.setExpandRatio(viewContainer, 1.0f); 


    navigator = new Navigator(this, viewContainer); 
    navigator.addProvider(springViewProvider); 
    setNavigator(navigator); 

    setContent(root); 

我也嘗試使用ViewDisplay而不是單個組件容器(根),但具有相同的結果。我也實現了一個測試視圖導航到:

@SpringView(name = "test") 
public class PermalinkTest extends VerticalLayout implements View { 


@Override 
public void enter(ViewChangeListener.ViewChangeEvent event) { 
    removeAllComponents(); 
    String params = event.getParameters(); 
    addComponent(new Label(params)); 
} 
} 

我寫這個URL「本地主機時,得到這個NPE:8080 /永久/測試 缺少什麼我不應該SpringViewProvider被裝配

? 。

問候約翰

+0

視圖是accesed用''#前綴,因此,給一個嘗試與本地主機':!8080 /永久/#test',看看它是否工作。如果沒有前綴,你正在試圖訪問是'/永久/ test'路徑映射,而不是一個視圖的UI。 – saljuama

回答

0

自動裝配應儘快按照您設置的Vaadin - Spring集成正確

例如WebServlet必須擴展SpringVaadinServlet:

@WebServlet(value = "/*", asyncSupported = true) 
public static class PermalinkUIServlet extends SpringVaadinServlet{ 

     @Override 
     protected void servletInitialized() throws ServletException { 
      super.servletInitialized(); 
      ... 
     } 
    } 

春Vaadin版本是您使用也看看https://vaadin.com/wiki/-/wiki/Main/Vaadin+Spring

+0

嗨。對不起,不是更具體的,但我有兩個研究所「分離」由UIProvider(標上我的春節Vaadin的servlet)和自動裝配完美的作品在其他UI(自動裝配其他豆類,因爲用戶界面不會有SpringViewProvider) –

0

?我可以sugest你剛纔只是去簡單的導航,並添加viewProvider:

@Autowired 
SpringViewProvider viewProvider; 

Navigator navi = new Navigator(this,this); 
navi.addViewProvider(viewProvider); 
navi.setErrorView(ErrorView.class); 

這非常適用於這兩個版本1.0.0和1.1.1,不過這一招不SpringNavigator(1.1.1)

工作
2

當使用vaadin-spring-2.0.0SpringNavigator是託管@UIScope -ed豆,因此它可以被直接注射。 (您不必注入SpringViewProvider在所有如果你,否則並不需要它)

此外,你必須手動初始化SpringNavigator實例,以防止NullPointerException

@SpringUI 
public class SampleUi extends UI { 

    @Inject 
    private SpringNavigator navigator; 

    @Override 
    protected void init(VaadinRequest request) { 
     navigator.init(this, this); // Explicit init() call 
     navigator.navigateTo(StartView.NAME); 
    } 
} 
1

如果您需要使用SpringViewProvider手動你需要通過就這樣一個構造函數來發送:

@SpringUI 
@Theme(ValoTheme.THEME_NAME) 
public class NavigationUI extends UI { 

    private final SpringViewProvider viewProvider; 

    @Autowired 
    public NavigationUI(SpringViewProvider viewProvider) { 
     this.viewProvider = viewProvider; 
    } 

    @Override 
    protected void init(VaadinRequest request) { 
     final VerticalLayout root = new VerticalLayout(); 
     root.setSizeFull(); 
     root.setMargin(true); 
     root.setSpacing(true); 
     setContent(root); 
... 

這個例子是來自官方Spring4Vaadin項目採取 - https://github.com/peholmst/vaadin4spring