Я новичок в разработке пользовательского интерфейса Vaadin, пожалуйста, извините меня в случае каких-либо глупых ошибок. может кто-нибудь помочь?
Я пытаюсь создать страницу входа, используя ссылку https://vaadin.com/wiki/-/wiki/Main/Creating+a+simple+login+view упоминается на веб-сайте Vaadin. Но я получаю сообщение об ошибке - com.vaadin.server.ServiceException: java.lang.RuntimeException: java.lang.InstantiationException
Есть 3 класса
1) для представления входа в систему 2) для основного представления 3) основной класс, который перемещается между представленными выше 2 представлениями
1) Вид входа в систему выглядит следующим образом:
public abstract class SimpleLoginView extends CustomComponent implements View,
Button.ClickListener {
private static final long serialVersionUID = 1L;
public static final String NAME = "login";
private final TextField user;
private final PasswordField password;
private final Button loginButton;
public SimpleLoginView() {
setSizeFull();
// Create the user input field
user = new TextField("User:");
user.setWidth("300px");
user.setRequired(true);
user.setInputPrompt("Your username (eg. [email protected])");
user.addValidator(new EmailValidator(
"Username must be an email address"));
user.setInvalidAllowed(false);
// Create the password input field
password = new PasswordField("Password:");
password.setWidth("300px");
password.addValidator(new PasswordValidator());
password.setRequired(true);
password.setValue("");
password.setNullRepresentation("");
// Create login button
loginButton = new Button("Login", this);
// Add both to a panel
VerticalLayout fields = new VerticalLayout(user, password, loginButton);
fields.setCaption("Please login to access the application. ([email protected]/passw0rd)");
fields.setSpacing(true);
fields.setMargin(new MarginInfo(true, true, true, false));
fields.setSizeUndefined();
// The view root layout
VerticalLayout viewLayout = new VerticalLayout(fields);
viewLayout.setSizeFull();
viewLayout.setComponentAlignment(fields, Alignment.MIDDLE_CENTER);
viewLayout.setStyleName(Reindeer.LAYOUT_BLUE);
setCompositionRoot(viewLayout);
}
@Override
public void enter(ViewChangeEvent event) {
// focus the username field when user arrives to the login view
user.focus();
}
// Validator for validating the passwords
private static final class PasswordValidator extends
AbstractValidator<String> {
/**
*
*/
private static final long serialVersionUID = 1L;
public PasswordValidator() {
super("The password provided is not valid");
}
@Override
protected boolean isValidValue(String value) {
//
// Password must be at least 8 characters long and contain at least
// one number
//
if (value != null
&& (value.length() < 8 || !value.matches(".*\\d.*"))) {
return false;
}
return true;
}
@Override
public Class<String> getType() {
return String.class;
}
}
@Override
public void buttonClick(ClickEvent event) {
//
// Validate the fields using the navigator. By using validors for the
// fields we reduce the amount of queries we have to use to the database
// for wrongly entered passwords
//
if (!user.isValid() || !password.isValid()) {
return;
}
String username = user.getValue();
String password = this.password.getValue();
//
// Validate username and password with database here. For examples sake
// I use a dummy username and password.
//
boolean isValid = username.equals("[email protected]")
&& password.equals("passw0rd");
if (isValid) {
// Store the current user in the service session
getSession().setAttribute("user", username);
// Navigate to main view
getUI().getNavigator().navigateTo(MainView.NAME);//
} else {
// Wrong password clear the password field and refocuses it
this.password.setValue(null);
this.password.focus();
}
}
2) Основной вид, как показано ниже:
public class MainView extends CustomComponent implements View {
/**
*
*/
private static final long serialVersionUID = 1L;
public static final String NAME = "";
Label text = new Label();
Button logout = new Button("Logout", new Button.ClickListener() {
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
public void buttonClick(ClickEvent event) {
// "Logout" the user
getSession().setAttribute("user", null);
// Refresh this view, should redirect to login view
getUI().getNavigator().navigateTo(NAME);
}
});
public MainView() {
setCompositionRoot(new CssLayout(text, logout));
}
@Override
public void enter(ViewChangeEvent event) {
// Get the user name from the session
String username = String.valueOf(getSession().getAttribute("user"));
// And show the username
text.setValue("Hello " + username);
}
}
3) Основной класс, который перемещается между двумя представлениями выше.
public class LoginUI extends UI {
@WebServlet(value = "/*", asyncSupported = true)
@VaadinServletConfiguration(productionMode = false, ui = LoginUI.class)
public static class Servlet extends VaadinServlet {
}
@Override
protected void init(VaadinRequest request) {
//
// Create a new instance of the navigator. The navigator will attach
// itself automatically to this view.
//
new Navigator(this, this);
//
// The initial log view where the user can login to the application
//
getNavigator().addView(SimpleLoginView.NAME, SimpleLoginView.class);//
//
// Add the main view of the application
//
getNavigator().addView(MainView.NAME,
MainView.class);
//
// We use a view change handler to ensure the user is always redirected
// to the login view if the user is not logged in.
//
getNavigator().addViewChangeListener(new ViewChangeListener() {
@Override
public boolean beforeViewChange(ViewChangeEvent event) {
// Check if a user has logged in
boolean isLoggedIn = getSession().getAttribute("user") != null;
boolean isLoginView = event.getNewView() instanceof SimpleLoginView;
if (!isLoggedIn && !isLoginView) {
// Redirect to login view always if a user has not yet
// logged in
getNavigator().navigateTo(SimpleLoginView.NAME);
return false;
} else if (isLoggedIn && isLoginView) {
// If someone tries to access to login view while logged in,
// then cancel
return false;
}
return true;
}
@Override
public void afterViewChange(ViewChangeEvent event) {
}
});
}
}
При запуске кода в Tomcat я получаю следующую ошибку:
` type Exception report
message com.vaadin.server.ServiceException: java.lang.RuntimeException: java.lang.InstantiationException
description The server encountered an internal error that prevented it from fulfilling this request. exception
javax.servlet.ServletException: com.vaadin.server.ServiceException: java.lang.RuntimeException: java.lang.InstantiationException com.vaadin.server.VaadinServlet.service(VaadinServlet.java:307) javax.servlet.http.HttpServlet.service (HttpServlet.java:727) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
основная причина
com.vaadin.server.ServiceException: java.lang.RuntimeException: java.lang.InstantiationException com.vaadin.server.VaadinService.handleExceptionDuringRequest(VaadinService.java:1460) ) com.vaadin.server.VaadinServlet.service(VaadinServlet.java:305) javax.servlet.http.HttpServlet.service(HttpServlet.java:727) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java :52)
основная причина
java.lang.RuntimeException: java.lang.InstantiationException com.vaadin.navigator.Navigator$ClassBasedViewProvider.getView(Navigator.java:340) com.vaadin.navigator.Navigator.navigateTo(Navigator.java:512) com.example.login .LoginUI$1.beforeViewChange(LoginUI.java:58) com.vaadin.navigator.Navigator.fireBeforeViewChange(Navigator.java:595) com.vaadin.navigator.Navigator.navigateTo(Navigator.java:553) com.vaadin.navigator. Navigator.navigateTo(Navigator.java:526) com.vaadin.ui.UI.doInit(UI.java:644) 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:305) javax.servlet.http.HttpServlet.se rvice(HttpServlet.java:727) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
основная причина
java.lang.InstantiationException sun.reflect.InstantiationExceptionConstructorAccessorImpl.newInstance(неизвестный источник) java.lang.reflect.Constructor.newInstance(неизвестный источник) java.lang.Class.newInstance(неизвестный источник) com.vaadin.navigator.Navigator$ClassBasedViewProvider. getView(Navigator.java:336) com.vaadin.navigator.Navigator.navigateTo(Navigator.java:512) com.example.login.LoginUI$1.beforeViewChange(LoginUI.java:58) com.vaadin.navigator.Navigator.fireBeforeViewChange (Navigator.java:595) com.vaadin.navigator.Navigator.navigateTo(Navigator.java:553) com.vaadin.navigator.Navigator.navigateTo(Navigator.java:526) com.vaadin.ui.UI.doInit(UI .java:644) com.vaadin.server.communication.UIInitHandler.getBrowserDetailsUI(UIInitHandler.java:222) com.vaadin.server.communication.UIInitHandler.synchronizedHandleRequest(UIInitHandler.java:74) (SynchronizedRequestHandler.java:41) ком. vaadin.server.VaadinService.handleRequest(VaadinService.java:1402) com.vaadin.server.VaadinServlet.service(VaadinServlet.java:305) javax.servlet.http.HttpServlet.service(HttpServlet.java:727) org.apache. tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
note Полная трассировка стека основной причины доступна в журналах Apache Tomcat/7.0.55.
код>`