2016-01-13 55 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