Веб-приложение Vaadin, подключенное к базе данных MySQL, не работает

#mysql #spring-boot #vaadin #vaadin-grid

Вопрос:

Я столкнулся с проблемой, связанной с веб-приложением, которое я создаю на Vaadin. Я загрузил готовое веб-приложение Vaadin, подключенное к базе данных MySQL, чтобы проверить, как оно работает. Казалось, все работало нормально. Там была вкладка «Основные» с таблицей, содержащей данные базы данных, и формой для добавления или удаления дополнительных элементов в базе данных.

Я внес некоторые изменения, например, добавил еще несколько вкладок в веб-приложение или изменил тему и внешний вид, и не столкнулся ни с какими проблемами.

Затем я попытался добавить несколько новых столбцов в свою базу данных через Workbench, и тогда начались проблемы. Каждый раз, когда я пытаюсь добавить новый столбец в базу данных, сетка в веб-приложении исчезает, но я не получаю никаких ошибок….

Более конкретно:

-Я сначала изменил таблицу, добавив новый столбец через workbench с именем «examination_type».

ALTER TABLE dummydata.employees ADD COLUMN examination_type VARCHAR(1000);

-Во-вторых, я добавил поле examination_type в свои классы Java (теперь оно отображается в конструкторе, получателях и установщиках)

 
   private String firstname;
   private String lastname;
   private String examination_type;
   private String email;
   private String notes;
   

   public Employee(String firstname, String lastname, String examination_type, String email, String notes) {
       super();
       this.firstname = firstname;
       this.lastname = lastname;
       this.examination_type = examination_type;
       this.email = email;
       this.notes = notes;
   }
//Getters and Setters
 

-Затем я добавил поле в файл серверной службы везде, где это было необходимо:

 @Component
public class EmployeeService {
    
    @Autowired
    private JdbcTemplate jdbcTemplate;

    public List<Employee> findAll() {       
        try {
            return jdbcTemplate.query("SELECT firstname, lastname, email, examination_type FROM employees",
                    (rs, rowNum) -> new Employee(rs.getString("firstname"), rs.getString("lastname"), rs.getString("examination_type"), rs.getString("email"), rs.getString("notes")));
        } catch (Exception e) {
            return new ArrayList<Employee>();   
        }       
    }
    
    public List<Employee> findByEmail(String email) {       
        try {
            return jdbcTemplate.query("SELECT firstname, lastname, email, examination_type FROM employees WHERE email = ?",
                    new Object[]{email},
                    (rs, rowNum) -> new Employee(rs.getString("firstname"), rs.getString("lastname"), rs.getString("examination_type"), rs.getString("email"), rs.getString("notes")));
        } catch (Exception e) {
            return new ArrayList<Employee>();   
        }       
    }
    
    public int saveEmployee(Employee employee) {
        List<Employee> employees = this.findByEmail(employee.getEmail());
        if ( employees.size() > 0 ) {
            return updateEmployee(employee);
        } else {
            return insertEmployee(employee);
        }
        
    }
    
    private int updateEmployee(Employee employee) {     
        try {
            return jdbcTemplate.update("UPDATE employees SET lastname = ?, firstname = ?, examination_type = ? WHERE email = ?",
                    employee.getLastname(), employee.getFirstname(), employee.getExaminationType(), employee.getEmail());
        } catch (Exception e) {
            return 0;
        }
    }
    
    private int insertEmployee(Employee employee) {
        try {
            return jdbcTemplate.update("INSERT INTO employees VALUES (?, ?, ?, ?, ?)",
                    employee.getFirstname(), employee.getLastname(), employee.getExaminationType(), employee.getEmail(),  "" /*employee.getBirthDate()*/);
        } catch (Exception e) {
            return 0;
        }       
    }
    
    public int deleteEmployee(Employee employee) {
        try {
            return jdbcTemplate.update("DELETE FROM employees WHERE email = ?",
                    employee.getEmail());
        } catch (Exception e) {
            return 0;
        }
    }
}

 

-И последнее, но не менее важное: я добавил текстовое поле типа экзамена в свою форму

Во время компиляции программы ошибок нет, и я даже получаю сообщение «Интерфейс успешно скомпилирован». Затем я посещаю веб-сайт localhost, и сетка, в которой я должен видеть содержимое своей базы данных, не отображается. Форма, однако, работает нормально, и я могу добавлять новые элементы в базу данных.

Есть какие-нибудь идеи?

Извините за длинный пост!

Вот код для представления :

 @Route(value = "examinations", layout = MainView.class)
@PageTitle("Examinations")
@CssImport("styles/views/examinations/examinations-view.css")
public class ExaminationsView extends Div implements AfterNavigationObserver {

    @Autowired
    private EmployeeService employeeService;
    private Grid<Employee> employees;

    private TextField firstname = new TextField();
    private TextField lastname = new TextField();
    private TextField email = new TextField();
    private TextField examination_type = new TextField();

    private Button cancel = new Button("Cancel");
    private Button save = new Button("Save");
    private Button delete = new Button("Delete");
   
    private Binder<Employee> binder;

    public ExaminationsView() {
        setId("examinations-view");
        // Configure Grid
        employees = new Grid<>();
        employees.addThemeVariants(GridVariant.LUMO_NO_BORDER);
        employees.setHeightFull();
        employees.addColumn(Employee::getFirstname).setHeader("First name");
        employees.addColumn(Employee::getLastname).setHeader("Last name");
        employees.addColumn(Employee::getEmail).setHeader("Email");
        employees.addColumn(Employee::getExaminationType).setHeader("Examination Type");
        //when a row is selected or deselected, populate form
        employees.asSingleSelect().addValueChangeListener(event -> populateForm(event.getValue()));
        // Configure Form
        binder = new Binder<>(Employee.class);

        binder.bindInstanceFields(this);

        binder.setBean(new Employee());
        
        cancel.addClickListener(e -> employees.asSingleSelect().clear());

        save.addClickListener(e -> {
            Employee employee = binder.getBean();
            if ( employeeService.saveEmployee(employee) > 0) {
                employees.setItems(employeeService.findAll());
            } else {
                Notification.show("Save error");
            }               
        });
        
        delete.addClickListener(e -> {
            Employee employee = binder.getBean();
            if ( employeeService.deleteEmployee(employee) > 0) {
                employees.setItems(employeeService.findAll());
            } else {
                Notification.show("Delete error");
            }               
        });
        SplitLayout splitLayout = new SplitLayout();
        splitLayout.setSizeFull();

        createGridLayout(splitLayout);
        createEditorLayout(splitLayout);

        add(splitLayout);
    }
    

    private void createEditorLayout(SplitLayout splitLayout) {
        Div editorDiv = new Div();
        editorDiv.setId("editor-layout");
        FormLayout formLayout = new FormLayout();
        addFormItem(editorDiv, formLayout, firstname, "First name");
        addFormItem(editorDiv, formLayout, lastname, "Last name");
        addFormItem(editorDiv, formLayout, email, "Email");
        addFormItem(editorDiv, formLayout, examination_type, "Examination Type");
        createButtonLayout(editorDiv);
        splitLayout.addToSecondary(editorDiv);
    }

    private void createButtonLayout(Div editorDiv) {
        HorizontalLayout buttonLayout = new HorizontalLayout();
        buttonLayout.setId("button-layout");
        buttonLayout.setWidthFull();
        buttonLayout.setSpacing(true);
        cancel.addThemeVariants(ButtonVariant.LUMO_TERTIARY);
        save.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
        delete.addThemeVariants(ButtonVariant.LUMO_ERROR);
        buttonLayout.add(delete, cancel, save);
        editorDiv.add(buttonLayout);
    }

    private void createGridLayout(SplitLayout splitLayout) {
        Div wrapper = new Div();
        wrapper.setId("wrapper");
        wrapper.setWidthFull();
        splitLayout.addToPrimary(wrapper);
        wrapper.add(employees);
    }

    private void addFormItem(Div wrapper, FormLayout formLayout, AbstractField field, String fieldName) {       
        formLayout.addFormItem(field, fieldName);
        wrapper.add(formLayout);
        field.getElement().getClassList().add("full-width");
    }
    
    @Override
    public void afterNavigation(AfterNavigationEvent event) {
        employees.setItems(employeeService.findAll());
    }

    private void populateForm(Employee value) {
        if ( value == null ) {
            value = new Employee();
        }
        binder.setBean(value);
        
    }
}
 

Комментарии:

1. Возможно, глупый вопрос, но поскольку вы подавляете исключения в методе findAll, вы уже проверили, что JdbcTemplate не вызывает ошибок. запрос?

2. Привет! Я думаю, что наконец-то понял это, но думаю о вашем времени!

Ответ №1:

Прошло несколько часов с тех пор, как я опубликовал это, и несколько дней с тех пор, как впервые возникла проблема. В конце концов, кажется, что я передавал аргументы MySQL в другой последовательности, чем в базе данных? Казалось, что правильно расставить их-вот в чем фокус. Спасибо людям и всегда помните и всегда проверяйте аргументы….

Комментарии:

1. На самом деле это не ответ на этот вопрос. Не могли бы вы, пожалуйста, уточнить, что решило вашу проблему.

2. Я передавал аргументы MySQL в определенных командах(тех, которые извлекают данные из базы данных) в неправильном порядке. Это блокировало сетку данных для правильного отображения