簡體   English   中英

Bean驗證不起作用?

[英]Bean Validation doesn't work?

我正在尋找解決問題的方法,但仍然沒有找到。 在我的bean中,我正在使用注釋進行驗證,但無法正常工作,並且我正在尋找所有的互聯網來完成這項工作。

我正在使用:Vaadin 7和Maven

我做這個

/** person's bean */
@Entity
public class Person{

@Id
@GeneratedValue
private Integer id;

@NotNull
@NotEmpty
@Size(min=5, max=50, message="insert first name")
private String firstName;

@NotNull
@NotEmpty
@Email private String email;

//get and set
}

//my app
public class LoginView extends VerticalLayout{
    private TextField firstName, email;
    private BeanFieldGroup<Person> binder;
    private FormLayout form;

    public LoginView(){
           form = new FormLayout();
           binder = new BeanFieldGroup<Person>(Person.class);
           Field<?> field = null;
           field = binder.buildAndBind("Firstname", "firstName");
           firstName = (TextField)binder.getField("firstName");
           form.addComponent(firstName);

           field = binder.buildAndBind("Email", "email");
           email = (TextField)binder.getField("email");
           form.addComponent(email);
           this.addComponent(form);
     }
}

我該怎么做?

在此處輸入圖片說明

/** maven dependecy */
<dependency>
    <groupId>com.vaadin.addon</groupId>
    <artifactId>beanvalidation-addon</artifactId>
    <version>0.6.2</version>
</dependency>



/** exception */
java.lang.NoSuchMethodError: com.vaadin.event.EventRouter.fireEvent(Ljava/util/EventObject;Lcom/vaadin/server/ErrorHandler;)V
    at com.vaadin.server.VaadinService.onVaadinSessionStarted(VaadinService.java:783)
    at com.vaadin.server.VaadinService.createAndRegisterSession(VaadinService.java:740)
    at com.vaadin.server.VaadinService.doFindOrCreateVaadinSession(VaadinService.java:696)
    at com.vaadin.server.VaadinService.findOrCreateVaadinSession(VaadinService.java:637)
    at com.vaadin.server.VaadinService.findVaadinSession(VaadinService.java:501)
    at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1376)
    at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:238)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:315)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:724)

好了,找到正確的實現。 最后我將向您展示代碼。 你需要做什么:

  1. 將Person的實際實例設置為活頁夾的數據源
  2. 擺脫掉字段變量,它在您的代碼中是無用的,您已經擁有了firstNameemail字段,這些字段最終被添加到了表單布局中,該字段並沒有結束。
  3. 添加一個按鈕以提交表單,並檢查錯誤消息(如果有)。

這是代碼:

@Theme("mytheme")
public class MyVaadinUI extends UI {

    private Field firstName, email;
    private FormLayout form;

    @Override
    public void init(VaadinRequest request){
        VerticalLayout layout = new VerticalLayout();

        //1. set a propertyitem for the fieldgroup
        final BeanFieldGroup<Person> binder = new BeanFieldGroup<Person>(Person.class);
        binder.setItemDataSource(new BeanItem<Person>(new Person()));
        form = new FormLayout();


        //2. don't use field Field, it's useless
        firstName = binder.buildAndBind("Firstname", "firstName");
        email = binder.buildAndBind("Email", "email");

        form.addComponent(firstName);
        form.addComponent(email);

        layout.addComponent(form);

        //3. add a button to submit the form
        form.addComponent(new Button("OK", new Button.ClickListener() {
            @Override
            public void buttonClick(ClickEvent event) {
                try {
                    binder.commit();
                    Notification.show("Thanks!");
                } catch (FieldGroup.CommitException e) {
                    Notification.show("You fail!");
                }
            }
        }));
        setContent(layout);
    }
}

大家知道,我使用了兩個不同的依賴項,但是您應該首先嘗試使用自己的依賴項。 只需更改代碼,看看會發生什么。 這些是我使用的依賴項:

        <dependency>
        <groupId>org.hibernate.javax.persistence</groupId>
        <artifactId>hibernate-jpa-2.0-api</artifactId>
        <version>1.0.1.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>5.1.0.Final</version>
    </dependency>

好的,就像我說的那樣,您需要使用Vaadin的Bean Validation插件中提供的BeanValidationForm。

下面是一個示例:

@Theme("mytheme")
public class MyVaadinUI extends UI {

@Override
public void init(VaadinRequest request){
    VerticalLayout layout = new VerticalLayout();

    Person bean = new Person();

    final BeanValidationForm<Person> form = new BeanValidationForm<Person>(
            Person.class);

    // show null values as empty strings
    form.setFormFieldFactory(new DefaultFieldFactory() {
        @Override
        public Field createField(Item item, Object propertyId,
                                 Component uiContext) {
            Field field = super.createField(item, propertyId, uiContext);
            if (field instanceof TextField) {
                ((TextField) field).setNullRepresentation("");
            }
            return field;
        }
    });

    // use a BeanItem<BeanToValidate> for full validation
    form.setItemDataSource(new BeanItem<Person>(bean));

    // validate immediately when field focus lost but use explicit commit
    form.setImmediate(true);
    form.setWriteThrough(false);

    layout.addComponent(form);

    // explicit validation button
    Button validate = new Button("Validate");
    validate.addListener(new Button.ClickListener() {
        public void buttonClick(ClickEvent event) {
            try {
                form.validate();
                Notification.show("Validation successful");
            } catch (Validator.InvalidValueException e) {
                Notification.show(
                        "Validation failed: " + e.getMessage(),
                        Notification.TYPE_WARNING_MESSAGE);
            }
        }
    });
    layout.addComponent(validate);

    setContent(layout);
}
}

我將其添加為答案,因為我認為這將阻止您嘗試完全使用Bean驗證插件。

問題在於Bean驗證插件僅與Vaadin 6+版本兼容(我最近剛剛在插件頁面上查看了其兼容性): Vaadin Bean驗證支持的Vaadin版本

我正在猜測,因為您使用vaadin7標記了此問題,所以您正在使用Vaadin7。因此您無法使用此插件,因此會出現異常。

您需要尋找另一種為您的bean提供驗證的方法。 一種方法是將自定義Validator實例添加到您的字段中。 查看Vaadin書籍頁面的Bean驗證部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM