]> source.dussan.org Git - vaadin-framework.git/commitdiff
BeanValidator changed to throw exception with array of causes (#11324)
authorJarno Rantala <jarno.rantala@vaadin.com>
Wed, 26 Jun 2013 11:56:54 +0000 (14:56 +0300)
committerVaadin Code Review <review@vaadin.com>
Tue, 30 Jul 2013 07:45:02 +0000 (07:45 +0000)
BeanValidator was modified to throw InvalidValueException with array of causes
instead of exception with one message including HTML. This way
AbstractErrorMessage is able to create correct error notification message with
multiple lines.

Change-Id: I414189f56ac282daad9dd3fe58d13fd99108c479

server/src/com/vaadin/data/validator/BeanValidator.java
server/tests/src/com/vaadin/tests/data/bean/BeanToValidate.java
server/tests/src/com/vaadin/tests/data/bean/PersonWithBeanValidationAnnotations.java
server/tests/src/com/vaadin/tests/server/validation/TestBeanValidation.java
uitest/src/com/vaadin/tests/fieldgroup/FieldBinderWithBeanValidation.java

index ea7189bc5e469c683ac4737e8e8c2056f6a9f876..54efa51ac1ef3dcbaa2865e89aee16193ed7d2cb 100644 (file)
@@ -17,8 +17,6 @@
 package com.vaadin.data.validator;
 
 import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.List;
 import java.util.Locale;
 import java.util.Set;
 
@@ -115,7 +113,9 @@ public class BeanValidator implements Validator {
         Set<?> violations = getJavaxBeanValidator().validateValue(beanClass,
                 propertyName, value);
         if (violations.size() > 0) {
-            List<String> exceptions = new ArrayList<String>();
+            InvalidValueException[] causes = new InvalidValueException[violations
+                    .size()];
+            int i = 0;
             for (Object v : violations) {
                 final ConstraintViolation<?> violation = (ConstraintViolation<?>) v;
                 String msg = getJavaxBeanValidatorFactory()
@@ -123,16 +123,11 @@ public class BeanValidator implements Validator {
                                 violation.getMessageTemplate(),
                                 new SimpleContext(value, violation
                                         .getConstraintDescriptor()), locale);
-                exceptions.add(msg);
+                causes[i] = new InvalidValueException(msg);
+                ++i;
             }
-            StringBuilder b = new StringBuilder();
-            for (int i = 0; i < exceptions.size(); i++) {
-                if (i != 0) {
-                    b.append("<br/>");
-                }
-                b.append(exceptions.get(i));
-            }
-            throw new InvalidValueException(b.toString());
+
+            throw new InvalidValueException(null, causes);
         }
     }
 
index 416563babae7356d9a6ad708d0adc5b5aad8f8b7..034609764f64279bfe0d08648fa607ccdb99675e 100644 (file)
@@ -4,6 +4,7 @@ import javax.validation.constraints.Digits;
 import javax.validation.constraints.Max;
 import javax.validation.constraints.Min;
 import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
 import javax.validation.constraints.Size;
 
 public class BeanToValidate {
@@ -21,6 +22,10 @@ public class BeanToValidate {
     @Digits(integer = 3, fraction = 2)
     private String decimals;
 
+    @Pattern(regexp = "V*", message = "Must start with letter V")
+    @Size(min = 3, max = 6, message = "Must contain 3 - 6 letters")
+    private String nickname;
+
     public String getFirstname() {
         return firstname;
     }
@@ -53,4 +58,12 @@ public class BeanToValidate {
         this.decimals = decimals;
     }
 
+    public String getNickname() {
+        return nickname;
+    }
+
+    public void setNickname(String nickname) {
+        this.nickname = nickname;
+    }
+
 }
index 93b22732637f83ef674f2b7df88a6b3dace795cf..575730d946889100a0a460a2c2601653046650a2 100644 (file)
@@ -8,12 +8,15 @@ import javax.validation.constraints.Max;
 import javax.validation.constraints.Min;
 import javax.validation.constraints.NotNull;
 import javax.validation.constraints.Past;
+import javax.validation.constraints.Pattern;
 import javax.validation.constraints.Size;
 
 public class PersonWithBeanValidationAnnotations {
     @NotNull
     @Size(min = 5, max = 20)
+    @Pattern(regexp = "A.*")
     private String firstName;
+
     @NotNull
     private String lastName;
 
index 8f6928fc3537b6824d2cf1c41d79ce6b9568fb7e..b4409aed269f84055d2ac5312ebb30eee2c95643 100644 (file)
@@ -1,5 +1,6 @@
 package com.vaadin.tests.server.validation;
 
+import org.junit.Assert;
 import org.junit.Test;
 
 import com.vaadin.data.Validator.InvalidValueException;
@@ -54,4 +55,31 @@ public class TestBeanValidation {
         validator.validate("123.45");
     }
 
+    @Test
+    public void testBeanValidationException_OneValidationError() {
+        InvalidValueException[] causes = null;
+        BeanValidator validator = new BeanValidator(BeanToValidate.class,
+                "lastname");
+        try {
+            validator.validate(null);
+        } catch (InvalidValueException e) {
+            causes = e.getCauses();
+        }
+
+        Assert.assertEquals(1, causes.length);
+    }
+
+    @Test
+    public void testBeanValidationsException_TwoValidationErrors() {
+        InvalidValueException[] causes = null;
+        BeanValidator validator = new BeanValidator(BeanToValidate.class,
+                "nickname");
+        try {
+            validator.validate("A");
+        } catch (InvalidValueException e) {
+            causes = e.getCauses();
+        }
+
+        Assert.assertEquals(2, causes.length);
+    }
 }
index 4f83f5d0fdbc321c7fbd82c6ef21248549cedc58..2c202af02bd893a9a5c090e3418e36aa0ccd5fcd 100644 (file)
@@ -7,7 +7,6 @@ import com.vaadin.data.util.BeanItem;
 import com.vaadin.tests.components.TestBase;
 import com.vaadin.tests.data.bean.Address;
 import com.vaadin.tests.data.bean.Country;
-import com.vaadin.tests.data.bean.Person;
 import com.vaadin.tests.data.bean.PersonWithBeanValidationAnnotations;
 import com.vaadin.tests.data.bean.Sex;
 import com.vaadin.tests.util.Log;
@@ -90,8 +89,10 @@ public class FieldBinderWithBeanValidation extends TestBase {
                         p));
     }
 
-    public static Person getPerson(FieldGroup binder) {
-        return ((BeanItem<Person>) binder.getItemDataSource()).getBean();
+    public static PersonWithBeanValidationAnnotations getPerson(
+            FieldGroup binder) {
+        return ((BeanItem<PersonWithBeanValidationAnnotations>) binder
+                .getItemDataSource()).getBean();
     }
 
     @Override