这是我的代码。我想做以下事情。但我在LoginStep1类的getComponent(0)中获得异常。我该如何解决这个问题。 我是vaadin的新人。如果我的方法有误,则需要您的指导。
public class Login extends VerticalLayout implements View {
public static String viewName = "login";
public void enter(ViewChangeEvent event) {
removeAllComponents();
CustomLayout viewScreen = new CustomLayout("screens/screen-login");
Component step1 = new LoginStep1().getLoginStep1();
viewScreen.addComponent(step1, "login-steps");
addComponent(viewScreen);
}
}
@SuppressWarnings("serial")
public class LoginStep1 extends Login {
public Component getLoginStep1() {
CustomLayout stepScreen = new CustomLayout("components/screens/login-step1");
Button loginBtn = CommonComponents.getButton("Login", "btn btn-green btn-block");
loginBtn.addClickListener(new Button.ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
// this line gives me exception.
CustomLayout currentLayout = (CustomLayout) getComponent(0);
currentLayout.addComponent(new LoginStep2().getLoginStep2(request, posInfoResponse.getBody()), "login-steps");
}
});
}
stepScreen.addComponent(loginBtn,"login-btn");
return stepScreen;
}
它提供以下异常
com.vaadin.server.ServerRpcManager$RpcInvocationException: Unable to invoke method click in com.vaadin.shared.ui.button.ButtonServerRpc
at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:160)
at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:118)
at com.vaadin.server.communication.ServerRpcHandler.handleInvocations(ServerRpcHandler.java:408)
at com.vaadin.server.communication.ServerRpcHandler.handleRpc(ServerRpcHandler.java:273)
at com.vaadin.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:79)
at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:41)
at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1409)
at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:364)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:217)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:673)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:158)
... 29 more
Caused by: com.vaadin.event.ListenerMethod$MethodException: Invocation of method buttonClick in com.herman.login.LoginStep1$1 failed.
at com.vaadin.event.ListenerMethod.receiveEvent(ListenerMethod.java:528)
at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:198)
at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:161)
at com.vaadin.server.AbstractClientConnector.fireEvent(AbstractClientConnector.java:1003)
at com.vaadin.ui.Button.fireClick(Button.java:377)
at com.vaadin.ui.Button$1.click(Button.java:54)
... 34 more
Caused by: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.LinkedList.checkElementIndex(Unknown Source)
at java.util.LinkedList.get(Unknown Source)
at com.vaadin.ui.AbstractOrderedLayout.getComponent(AbstractOrderedLayout.java:414)
at com.herman.login.LoginStep1$1.buttonClick(LoginStep1.java:23)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.vaadin.event.ListenerMethod.receiveEvent(ListenerMethod.java:508)
... 39 more
答案 0 :(得分:0)
有些事情仍然不清楚,因为你没有回答所有评论,所以
我不确定您用作导航器组件导航视图的3个实现中的哪一个(Login
,LoginStep1
或LoginStep2
)。但是,看Login
& LoginStep1
,我可以在当前设计中看到一些您可能想要重新考虑的内容:您正在创建继承类的新实例并在其上调用方法,而不是使用当前实例...
由于LoginStep2
的来源不可用,我将尝试涵盖其他两种情况:
1)假设您要导航到Login
的实例。
调用enter
方法后,会创建LoginStep1
的新实例,并将其添加到CustomLayout
内的组件列表中。
单击登录按钮时,将在getComponent(0)
的新实例上调用LoginStep1
,该实例不从Login
实例继承用于导航,因此它包含导致您的例外的0个组件
2)假设您导航到LoginStep1
的实例,该实例扩展了Login
。
当触发enter事件并执行从超类继承的enter
方法时,会创建LoginStep1
的新实例并将其添加到{{1}内的组件列表中}。
当您单击登录按钮时,CustomLayout
将在getComponent(0)
的新实例上调用,该实例与当前{{1}无关导航中使用的实例,因此它包含导致您的异常的0个组件
总之,这更可能与基本的java继承概念相关,而不是与Vaadin相关,主要问题可能是LoginStep1
LoginView1