Проблемы со страницей входа в Vaadin

Я новичок в разработке пользовательского интерфейса 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.


`


person Arun Shankar    schedule 12.09.2014    source источник
comment
Вы должны переформатировать свой вопрос, чтобы его можно было правильно прочитать.   -  person Roland Krüger    schedule 12.09.2014


Ответы (1)


Класс Vaadin Navigator пытается создать экземпляры своих классов представлений путем отражения, если представления добавляются в навигатор через Navigator#addView(String viewName, Class<? extends View> viewClass). Но в вашем случае класс SimpleLoginView не может быть создан, потому что вы объявили его abstract. Удалите классификатор abstract из определения класса представления, и ваш пример должен работать.

person Roland Krüger    schedule 12.09.2014
comment
Один вопрос. В SimpleLoginView.java есть строка, как показано ниже viewLayout.setStyleName(Reindeer.LAYOUT_BLUE); Я считаю, что это должно установить цвет фона на синий, но в настоящее время это не так. Он поставляется без какого-либо цвета фона. Пожалуйста, дайте мне знать, как этого добиться? - person Arun Shankar; 12.09.2014
comment
Чтобы изменить внешний вид вашего приложения Vaadin, я бы посоветовал вам взглянуть на темы Vaadin: vaadin.com/book/-/page/themes.html Это слишком широкая тема, чтобы обсуждать ее в комментарии :) - person Roland Krüger; 12.09.2014