diff --git a/javaxval/src/main/java/org/baeldung/Customer.java b/javaxval/src/main/java/org/baeldung/Customer.java new file mode 100644 index 0000000000..a90fb419de --- /dev/null +++ b/javaxval/src/main/java/org/baeldung/Customer.java @@ -0,0 +1,66 @@ +package org.baeldung; + +import java.util.List; +import java.util.Optional; +import java.util.OptionalInt; + +import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.PositiveOrZero; + +public class Customer { + + @NotBlank(message="Name cannot be empty") + private String name; + + private List<@NotBlank(message="Address must not be blank") String> addresses; + + private Integer age; + + @PositiveOrZero + private OptionalInt numberOfOrders; + + //@NotBlank + private Profile profile; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getAddresses() { + return addresses; + } + + public void setAddresses(List addresses) { + this.addresses = addresses; + } + + public Optional<@Min(18) Integer> getAge() { + return Optional.ofNullable(age); + } + + public void setAge(Integer age) { + this.age = age; + } + + public OptionalInt getNumberOfOrders() { + return numberOfOrders; + } + + public void setNumberOfOrders(OptionalInt numberOfOrders) { + this.numberOfOrders = numberOfOrders; + } + + public Profile getProfile() { + return profile; + } + + public void setProfile(Profile profile) { + this.profile = profile; + } + +} diff --git a/javaxval/src/main/java/org/baeldung/CustomerMap.java b/javaxval/src/main/java/org/baeldung/CustomerMap.java new file mode 100644 index 0000000000..37446cf86e --- /dev/null +++ b/javaxval/src/main/java/org/baeldung/CustomerMap.java @@ -0,0 +1,19 @@ +package org.baeldung; + +import java.util.Map; + +import javax.validation.constraints.Email; +import javax.validation.constraints.NotNull; + +public class CustomerMap { + + private Map<@Email(message="Must be a valid email") String, @NotNull Customer> customers; + + public Map getCustomers() { + return customers; + } + + public void setCustomers(Map customers) { + this.customers = customers; + } +} diff --git a/javaxval/src/main/java/org/baeldung/Profile.java b/javaxval/src/main/java/org/baeldung/Profile.java new file mode 100644 index 0000000000..ec73a5c62f --- /dev/null +++ b/javaxval/src/main/java/org/baeldung/Profile.java @@ -0,0 +1,13 @@ +package org.baeldung; + +public class Profile { + private String companyName; + + public String getCompanyName() { + return companyName; + } + + public void setCompanyName(String companyName) { + this.companyName = companyName; + } +} diff --git a/javaxval/src/main/java/org/baeldung/valueextractors/ProfileValueExtractor.java b/javaxval/src/main/java/org/baeldung/valueextractors/ProfileValueExtractor.java new file mode 100644 index 0000000000..f192034261 --- /dev/null +++ b/javaxval/src/main/java/org/baeldung/valueextractors/ProfileValueExtractor.java @@ -0,0 +1,17 @@ +package org.baeldung.valueextractors; + +import javax.validation.valueextraction.ExtractedValue; +import javax.validation.valueextraction.UnwrapByDefault; +import javax.validation.valueextraction.ValueExtractor; + +import org.baeldung.Profile; + +@UnwrapByDefault +public class ProfileValueExtractor implements ValueExtractor<@ExtractedValue(type = String.class) Profile> { + + @Override + public void extractValues(Profile originalValue, ValueExtractor.ValueReceiver receiver) { + receiver.value(null, originalValue.getCompanyName()); + } + +} diff --git a/javaxval/src/main/resources/META-INF/services/javax.validation.valueextraction.ValueExtractor b/javaxval/src/main/resources/META-INF/services/javax.validation.valueextraction.ValueExtractor new file mode 100644 index 0000000000..e77a30cfe4 --- /dev/null +++ b/javaxval/src/main/resources/META-INF/services/javax.validation.valueextraction.ValueExtractor @@ -0,0 +1 @@ +org.baeldung.valueextractors.ProfileValueExtractor \ No newline at end of file diff --git a/javaxval/src/test/java/org/baeldung/ContainerValidationIntegrationTest.java b/javaxval/src/test/java/org/baeldung/ContainerValidationIntegrationTest.java new file mode 100644 index 0000000000..dff02ff13d --- /dev/null +++ b/javaxval/src/test/java/org/baeldung/ContainerValidationIntegrationTest.java @@ -0,0 +1,88 @@ +package org.baeldung; + +import static org.junit.Assert.assertEquals; + +import java.util.Collections; +import java.util.OptionalInt; +import java.util.Set; + +import javax.validation.ConstraintViolation; +import javax.validation.Validation; +import javax.validation.Validator; +import javax.validation.ValidatorFactory; +import org.baeldung.valueextractors.ProfileValueExtractor; + +import org.junit.Before; +import org.junit.Test; + +public class ContainerValidationIntegrationTest { + private Validator validator; + + @Before + public void setup() { + ValidatorFactory factory = Validation.byDefaultProvider().configure() + .addValueExtractor(new ProfileValueExtractor()).buildValidatorFactory(); + validator = factory.getValidator(); + } + + @Test + public void whenEmptyAddress_thenValidationFails() { + Customer customer = new Customer(); + customer.setName("John"); + customer.setAddresses(Collections.singletonList(" ")); + Set> violations = validator.validate(customer); + assertEquals(1, violations.size()); + assertEquals("Address must not be blank", violations.iterator() + .next() + .getMessage()); + } + + @Test + public void whenInvalidEmail_thenValidationFails() { + CustomerMap map = new CustomerMap(); + map.setCustomers(Collections.singletonMap("john", new Customer())); + Set> violations = validator.validate(map); + assertEquals(1, violations.size()); + assertEquals("Must be a valid email", violations.iterator() + .next() + .getMessage()); + } + + @Test + public void whenAgeTooLow_thenValidationFails() { + Customer customer = new Customer(); + customer.setName("John"); + customer.setAge(15); + Set> violations = validator.validate(customer); + assertEquals(1, violations.size()); + } + + @Test + public void whenAgeNull_thenValidationSucceeds() { + Customer customer = new Customer(); + customer.setName("John"); + Set> violations = validator.validate(customer); + assertEquals(0, violations.size()); + } + + @Test + public void whenNumberOrdersValid_thenValidationSucceeds() { + Customer customer = new Customer(); + customer.setName("John"); + customer.setNumberOfOrders(OptionalInt.of(1)); + Set> violations = validator.validate(customer); + assertEquals(0, violations.size()); + } + + //@Test + public void whenProfileCompanyNameBlank_thenValidationFails() { + Customer customer = new Customer(); + customer.setName("John"); + Profile profile = new Profile(); + profile.setCompanyName(" "); + customer.setProfile(profile); + Set> violations = validator.validate(customer); + assertEquals(1, violations.size()); + } + +}