BeanValidation chrashes Application (InvalidValueException)

Hello,

I created a simple Project to become familiar with the BeanValidation in Vaadin and during my tests, I noticed a strange behavior that depends on the setBuffered-Property of the FieldGroup. Bound to the FieldGroup is a TextField, which should be validated.

If you set the setBuffered-Property of the FieldGroup to true, everything works fine.
If it is false, the hole application crashes with a com.vaadin.data.Validator$InvalidValueException during startup of the application.

Bean.java:
[size=2]
@NotNull
@Size(min = 2, max = 10)
private String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
[/size]

MyForm.java:
[size=2]
@PropertyId(“name”)
TextField tf = new TextField(“TextField”);
Item newDataSource;

public MyForm () {
    FormLayout fl = new FormLayout();
    tf.setImmediate(true);
    tf.addValidator(new BeanValidator(Bean.class,"name"));
    fl.addComponent(tf);
    setCompositionRoot(fl);
}

@Override
public void setItemDataSource(Item newDataSource) {
    this.newDataSource = newDataSource;
    FieldGroup fg = new FieldGroup(newDataSource);
    fg.bindMemberFields(this);
    [b]

fg.setBuffered(false);
[/b] // → Chrash!
}

@Override
public Item getItemDataSource() {
    return newDataSource;
}

[/size]

thrown Exception:
[size=2]
INFO: HV000001: Hibernate Validator 4.3.2.Final
Jun 30, 2015 9:46:11 AM com.vaadin.server.DefaultErrorHandler doDefault
SCHWERWIEGEND:
com.vaadin.data.Validator$InvalidValueException
at com.vaadin.data.validator.BeanValidator.validate(BeanValidator.java:130)
at com.vaadin.ui.AbstractField.validate(AbstractField.java:969)
at com.vaadin.ui.AbstractField.validate(AbstractField.java:934)
at com.vaadin.ui.AbstractField.commit(AbstractField.java:268)
at com.vaadin.ui.AbstractField.setBuffered(AbstractField.java:363)
at com.vaadin.data.fieldgroup.FieldGroup.setBuffered(FieldGroup.java:159)
at test.MyForm.setItemDataSource(MyForm.java:32)
at test.MyUI.init(MyUI.java:30)
at com.vaadin.ui.UI.doInit(UI.java:646)
at com.vaadin.server.communication.UIInitHandler.getBrowserDetailsUI(UIInitHandler.java:214)
at com.vaadin.server.communication.UIInitHandler.synchronizedHandleRequest(UIInitHandler.java:74)
at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:41)
at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1408)
at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:350)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:668)
at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:223)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1517)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1474)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)

Jun 30, 2015 9:46:11 AM org.apache.catalina.core.StandardWrapperValve invoke
SCHWERWIEGEND: Servlet.service() for servlet [MyUIServlet]
in context with path
[/test] threw exception [com.vaadin.server.ServiceException: com.vaadin.data.Validator$InvalidValueException]
with root cause
com.vaadin.data.Validator$InvalidValueException
at com.vaadin.data.validator.BeanValidator.validate(BeanValidator.java:130)
at com.vaadin.ui.AbstractField.validate(AbstractField.java:969)
at com.vaadin.ui.AbstractField.validate(AbstractField.java:934)
at com.vaadin.ui.AbstractField.commit(AbstractField.java:268)
at com.vaadin.ui.AbstractField.setBuffered(AbstractField.java:363)
at com.vaadin.data.fieldgroup.FieldGroup.setBuffered(FieldGroup.java:159)
at test.MyForm.setItemDataSource(MyForm.java:32)
at test.MyUI.init(MyUI.java:30)
at com.vaadin.ui.UI.doInit(UI.java:646)
at com.vaadin.server.communication.UIInitHandler.getBrowserDetailsUI(UIInitHandler.java:214)
at com.vaadin.server.communication.UIInitHandler.synchronizedHandleRequest(UIInitHandler.java:74)
at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:41)
at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1408)
at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:350)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:668)
at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:223)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1517)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1474)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
[/size]

(You can take a look on the implementation in the attachment)

My question is why this behavior occurs and what is the reason for the crash. I did not expect, that the entire application crashes because of a simple BeanValidation. Even if the TextField, which should be validated, is null.

Through the NotNull-BeanValidation, the user should get a hint so that he has to enter something in the TextField.
20407.zip (439 KB)

Hi,

Make your BeanFieldGroup non-buffered before you actually assign the bean to it. Try switching these lines to opposite order:

        fg.bindMemberFields(this);
        fg.setBuffered(false); // -> Chrash!

cheers,
matti

Great. Your solution has solved my problem. Thank you Matti!