Vaadin7中的NPE使用我自己的ViewProvider实现导航。

时间:2015-04-24 14:48:34

标签: java exception vaadin vaadin7

我尝试使用Navigator创建一个vaadin7应用程序。 我有自己的ViewProvider实现。

这是UI类的相关部分:

 @Override
protected void init(VaadinRequest request) {
    layout = new VerticalLayout();
    layout.setSizeFull();

    setContent(layout);

    navigator = new Navigator(this, layout);
    mainView = new MainView(navigator);
    navigator.addView("", mainView);

    ViewProviderImpl viewProviderImpl = new ViewProviderImpl(mainView);
    navigator.addProvider(viewProviderImpl);
}

这是MainView :(这是默认显示的那个。目前它只包含两个按钮。如果按下按钮,导航器应该将他带到其他视图之一)

 public MainView(Navigator navigator) {

    this.setSizeFull();

    this.addComponent(new Label("This is the main view 1"));

    int i = 1;
    createSubViewButtons(i++ , Constants.DASHBOARD, new DashboardView());
    createSubViewButtons(i++ , Constants.SCHEDULE, new ScheduleView());

}

private void createSubViewButtons(int exNum, String caption, View view) {
    navigator.addView(caption, view);

    Button button = new Button(caption, new ClickListener() {
        private static final long serialVersionUID = 1L;

        @Override
        public void buttonClick(ClickEvent event) {

            navigator.navigateTo(event.getButton().getData().toString());

        }
    });

    button.setData(caption);
    button.setStyleName(Reindeer.BUTTON_DEFAULT);

    this.addComponent(button);
}

我有一个实现ViewProvider的类。 这基本上应该将URL映射到视图。 getViewName()方法删除了url的不必要部分,getView()应该根据getViewName()的返回值返回View实例。 (无论如何,我强烈感觉代码执行永远不会到达,因为异常发生在前面)

public class ViewProviderImpl implements ViewProvider {

private static final long serialVersionUID = 1L;

private static Map<String, View> mapping;

static {
    mapping =  new HashMap<String, View>();
    ScheduleView scheduleView = new ScheduleView();
    DashboardView dashboardView = new DashboardView();
    mapping.put("CORE/maintain/schedule", scheduleView);
    mapping.put("CORE/maintain/dashboard", dashboardView);
    mapping.put(Constants.DASHBOARD, dashboardView);
    mapping.put(Constants.SCHEDULE, scheduleView);
}

public ViewProviderImpl(MainView mv) {
    mapping.put("", mv);
}

@Override
public String getViewName(String viewAndParameters) {

    // to do --if it is non empty than take it otherwise use Page 

    StringBuilder sb = new StringBuilder();
    String fullURL = Page.getCurrent().getLocation().toString();
    String fullURL = viewAndParameters;

    String arr[] = fullURL.split(Constants.ARRANGER_WITH_SLASH);
    if (arr.length > 1) {

        String shortURL = arr[1];

        if (shortURL.contains(Constants.QUESTION_MARK)) {
            shortURL = shortURL.split("\\?")[0];
        }
        if (shortURL.contains(Constants.SLASH)) {
            // always remove the two first and keep the rest of it.
            String split[] = shortURL.split(Constants.SLASH);
            for (int i = 0; i < split.length; i++ ) {
                if (i <= 1) {
                    continue;
                }
                sb.append(split[i]);
                if (i >= 2 && i != split.length - 1) {
                    sb.append(Constants.SLASH);
                }
            }
        }
    }
    return sb.toString();
}

对我来说,这似乎是合乎逻辑的。实际上,它会引发NPE。为什么? 可能我滥用了Vaadin7中导航的使用方式,但我无法弄清楚我应该做些什么...

java.lang.NullPointerException
    vaadinacrys.MainView.createSubViewButtons(MainView.java:39)
    vaadinacrys.MainView.<init>(MainView.java:33)
    vaadinacrys.PoolarrangerUI.init(PoolarrangerUI.java:36)
    com.vaadin.ui.UI.doInit(UI.java:641)
    com.vaadin.server.communication.UIInitHandler.getBrowserDetailsUI(UIInitHandler.java:222)
    com.vaadin.server.communication.UIInitHandler.synchronizedHandleRequest(UIInitHandler.java:74)
    com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:41)
    com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1402)
    com.vaadin.server.VaadinServlet.service(VaadinServlet.java:295)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

1 个答案:

答案 0 :(得分:1)

跟进我的原始评论,您尚未完全发布您的MainView课程,但在其构造函数中,您并未将Navigator navigator变量分配给字段,也未将其作为createSubViewButtons方法的参数,以便您可以在那里使用它。如果你确实有一个名为navigator的字段,那么当navigator.addView(caption, view);被执行时它将为空,因此你得到一个NPE。快速修复,this.navigator = navigator在您的构造函数和&amp;享受。