gpt4 book ai didi

java - Vaadin7 导航中的 NPE 以及我自己的 ViewProvider 实现。

转载 作者:行者123 更新时间:2023-12-01 11:37:15 25 4
gpt4 key购买 nike

我尝试使用 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:(这是默认情况下应显示的 View 。当前它仅包含两个按钮。如果有人点击按钮,导航器应将他带到其他 View 之一)

 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 映射到 View 。 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)

最佳答案

按照我原来的评论,您还没有完全发布您的 MainView 类,但在它的构造函数中,您没有将 Navigator navigator 变量分配给字段,也没有传递它作为 createSubViewButtons 方法的参数,以便您可以在那里使用它。如果您确实有一个名为 navigator 的字段,那么当 navigator.addView(caption, view); 执行时,它将为 null,因此您会得到一个 NPE。快速修复,在构造函数中使用 this.navigator = navigator 并享受。

关于java - Vaadin7 导航中的 NPE 以及我自己的 ViewProvider 实现。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29850594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com