#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 в определенных командах(тех, которые извлекают данные из базы данных) в неправильном порядке. Это блокировало сетку данных для правильного отображения