Vaadin 形式引发不存在的语法错误

问题描述

我正在尝试为学生项目创建示例 CRM。目前,我在 STS4 中使用 springboot 和 vaadin。我正在使用他们的食谱和 vaading crm 教程中的组件以及他们来自 github 的书店示例项目作为模板(我有点混淆了两者的元素,也许我的缺乏理解是导致我遇到这个麻烦的原因)。在提交表单中,第 67 行和第 49 行出现以下错误:“标记语法错误“;”,{ 预期在此标记之后”和“语法错误,插入“}”以完成块”。我正在添加我的完整表格供您检查,希望有人可以向我解释导致错误的原因。这是“我的”代码:

package com.vaadin.tutorial.crm.UI.views.list;

import com.vaadin.flow.component.Component;
import com.vaadin.flow.component.ComponentEvent;
import com.vaadin.flow.component.ComponentEventListener;
import com.vaadin.flow.component.HasValue;
import com.vaadin.flow.component.Key;
import com.vaadin.flow.component.button.Button;
import com.vaadin.flow.component.button.ButtonVariant;
import com.vaadin.flow.component.checkbox.CheckboxGroup;
import com.vaadin.flow.component.checkbox.CheckboxGroupVariant;
import com.vaadin.flow.component.combobox.ComboBox;
import com.vaadin.flow.component.formlayout.FormLayout;
import com.vaadin.flow.component.select.Select;
import com.vaadin.flow.component.listbox.ListBox;
import com.vaadin.flow.component.notification.Notification;
import com.vaadin.flow.component.KeyModifier;
import com.vaadin.flow.component.html.Div;
import com.vaadin.flow.component.html.Span;
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.component.textfield.EmailField;
import com.vaadin.flow.component.textfield.NumberField;
import com.vaadin.flow.component.textfield.TextField;
import com.vaadin.flow.data.binder.BeanValidationBinder;
import com.vaadin.flow.data.binder.Binder;
import com.vaadin.flow.data.binder.Result;
import com.vaadin.flow.data.binder.ValidationException;
import com.vaadin.flow.data.binder.ValueContext;
import com.vaadin.flow.shared.Registration;
import com.vaadin.tutorial.crm.backend.entity.Disponibilite;
import com.vaadin.tutorial.crm.backend.entity.Livre;
import com.vaadin.tutorial.crm.backend.entity.Livre.Categorie;
import com.vaadin.tutorial.crm.backend.entity.Stock;
import com.vaadin.flow.data.converter.Converter;
import com.vaadin.flow.data.converter.StringToIntegerConverter;

import java.util.List;
import java.util.Set;

public class LivreForm extends FormLayout{
    private Livre livre;
    private final Select<Disponibilite> disponibilite;
    private final TextField stockCount;
    TextField titreLivre = new TextField("titreLivre");
    TextField description = new TextField("description");
    TextField auteur = new TextField("auteur");
    TextField refeni = new TextField("refeni");
    TextField isbn = new TextField("isbn");
    stockCount = new TextField("In stock");
    stockCount.addThemeVariants(TextFieldVariant.LUMO_ALIGN_RIGHT);
    stockCount.setValueChangeMode(ValueChangeMode.EAGER);
    disponibilite = new Select<>();
    disponibilite.setLabel("Disponibilite");
    disponibilite.setWidth("100%");
    disponibilite.setItems(Disponibilite.values());
    content.add(disponibilite);
    
    ComboBox<Livre.Categorie> categorie = new ComboBox<>("Categorie");
    ListBox<Stock> stock = new ListBox<Stock>();
    
    ComboBox<Livre.Campus> campus = new ComboBox<>("Campus");
    
    Button save = new Button("Save"); 
    Button delete = new Button("Delete");
    Button close = new Button("Cancel");
    Binder<Livre> binder = new BeanValidationBinder<>(Livre.class);

    
    public LivreForm(List<Stock> stocks) {
        addClassName("livre-form");
        binder.bindInstanceFields(this);
        stock.setItems(stocks);
        disponibilite.setItems(Disponibilite.values());
        categorie.setItems(Livre.Categorie.values());
        campus.setItems(Livre.Campus.values());;
        add(titreLivre,description,auteur,refeni,isbn,disponibilite,categorie,campus,stock,createButtonsLayout()); 
      }
    
    public void setLivre(Livre livre) {
        this.livre = livre; 
        binder.readBean(livre); 
    }
    
    
    
    
    private Component createButtonsLayout() {
        save.addThemeVariants(ButtonVariant.LUMO_PRIMARY); 
        delete.addThemeVariants(ButtonVariant.LUMO_ERROR);
        close.addThemeVariants(ButtonVariant.LUMO_TERTIARY);

        save.addClickShortcut(Key.ENTER); 
        close.addClickShortcut(Key.ESCAPE);
        
        save.addClickListener(event -> validateAndSave()); 
        delete.addClickListener(event -> fireEvent(new DeleteEvent(this,livre))); 
        close.addClickListener(event -> fireEvent(new CloseEvent(this))); 
        
        binder.addStatusChangeListener(e -> save.setEnabled(binder.isValid()));

        return new HorizontalLayout(save,delete,close); 
      }
    
    private void validateAndSave() {
          try {
            binder.writeBean(livre); 
            fireEvent(new SaveEvent(this,livre)); 
          } catch (ValidationException e) {
            e.printStackTrace();
          }
        }
    
    public static abstract class LivreFormEvent extends ComponentEvent<LivreForm> {
          

        /**
         * 
         */
        private static final long serialVersionUID = -7236023661050023675L;
        private Livre livre;

          protected LivreFormEvent(LivreForm source,Livre livre) { 
            super(source,false);
            this.livre = livre;
          }

          public Livre getLivre() {
            return livre;
          }
        }

        public static class SaveEvent extends LivreFormEvent {
          SaveEvent(LivreForm source,Livre livre) {
            super(source,livre);
          }
        }

        public static class DeleteEvent extends LivreFormEvent {
          DeleteEvent(LivreForm source,livre);
          }

        }

        public static class CloseEvent extends LivreFormEvent {
          CloseEvent(LivreForm source) {
            super(source,null);
          }
        }

        public <T extends ComponentEvent<?>> Registration addListener(Class<T> eventType,ComponentEventListener<T> listener) { 
          return getEventBus().addListener(eventType,listener);
        }
        
        @SuppressWarnings("serial")
        private static class StockCountConverter extends StringToIntegerConverter {

            public StockCountConverter() {
                super(0,"Could not convert value to " + Integer.class.getName()
                        + ".");
            }
        
    

}
}

这是错误的屏幕截图: the lines that cause unexplainable errors

解决方法

= 新的 BeanValidationBinder(Livre.class)

使用新的 Binder 而不是 beanvalidation binder

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...