Search code examples
javamavenvaadinvaadin7

Bean Validation doesn't work?


I'm looking for a solution to my problem but still haven't found. In my bean I'm using annotations to validations but doesn't work and I'm looking for in all internet to do this work.

I'm using: Vaadin 7 and Maven

I do this.

/** 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);
     }
}

How I can do this work ?

enter image description here

/** 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)

Solution

  • Alright, found the correct implementation. I'm going to show you the code at the end. What you need to do:

    1. Set an actual instance of Person as your data source for the binder
    2. Get rid of the field variable, it's useless in your code, you already have the firstName and email fields which you end up adding to your form layout, field doesn't end up anywhere.
    3. Add a button to submit the form and checkout the error messages if there are any.

    Here's the code:

    @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);
        }
    }
    

    Just so you know, I used a couple of different dependencies, but you should try with your own first. Just change the code and see what happens. These are the dependencies I used:

            <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>