2015-04-24 2 views
0

Я попытался создать приложение vaadin7 с помощью Navigator. У меня есть собственная реализация ViewProvider.NPE в 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() должен возвращать экземпляр View на основе возвращаемого значения getViewName(). (Во всяком случае, у меня есть сильное чувство, что выполнение кода никогда не получает здесь, как исключение происходит раньше)

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

Какая строка 'vaadinacrys.MainView.createSubViewButtons (MainView.java:39)'? Я не вижу никакого конструктора 'this.navigator = navigator' в конструкторе MainView ... – Morfic

+0

Ваш код полон ошибок во время компиляции. Можете ли вы предоставить SSCCE (http://sscce.org/)? – kukis

+0

Morfic, точно. Это проблема. Я, очевидно, упустил эту «второстепенную» деталь ... Райт это как ответ, и я рад отметить ее как принятую. –

ответ

1

Следуя мой оригинальный комментарий, вы не в полной мере отвечали своему MainView класса, но в его конструкторе вы не назначаете переменную Navigator navigator в поле и не передаете ее как параметр методу createSubViewButtons, чтобы вы могли использовать его там. Если у вас действительно поле под названием navigator, к моменту выполнения navigator.addView(caption, view); оно будет нулевым, следовательно, вы получите NPE. Быстрое исправление, this.navigator = navigator в вашем конструкторе & наслаждайтесь.

Смежные вопросы