diff --git a/javax-validation-advanced/.gitignore b/javax-validation-advanced/.gitignore deleted file mode 100644 index 8027134ae9..0000000000 --- a/javax-validation-advanced/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -.classpath -.project -.settings/ -target/ -bin/ - diff --git a/javax-validation-advanced/README.md b/javax-validation-advanced/README.md deleted file mode 100644 index b3ed669c39..0000000000 --- a/javax-validation-advanced/README.md +++ /dev/null @@ -1,6 +0,0 @@ -## Java Bean Validation Examples - -This module contains articles about Bean Validation. - -### Relevant Articles: -- [Object Validation After Deserialization](https://www.baeldung.com/java-object-validation-deserialization) diff --git a/javax-validation-advanced/pom.xml b/javax-validation-advanced/pom.xml deleted file mode 100644 index 7709f37883..0000000000 --- a/javax-validation-advanced/pom.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - 4.0.0 - javax-validation-advanced - javax-validation-advanced - - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - - - - - org.springframework.boot - spring-boot-starter-validation - ${spring.boot.version} - - - com.fasterxml.jackson.core - jackson-databind - ${jackson.databind.version} - - - - - 2.7.5 - 2.14.0 - - - \ No newline at end of file diff --git a/javaxval-2/README.md b/javaxval-2/README.md index 0fd5ce163b..e10629975c 100644 --- a/javaxval-2/README.md +++ b/javaxval-2/README.md @@ -6,4 +6,5 @@ This module contains articles about Bean Validation. - [Method Constraints with Bean Validation 2.0](https://www.baeldung.com/javax-validation-method-constraints) - [Guide to ParameterMessageInterpolator](https://www.baeldung.com/hibernate-parametermessageinterpolator) - [Hibernate Validator Annotation Processor in Depth](https://www.baeldung.com/hibernate-validator-annotation-processor) +- [Object Validation After Deserialization](https://www.baeldung.com/java-object-validation-deserialization) - More articles: [[<-- prev]](../javaxval) \ No newline at end of file diff --git a/javaxval-2/pom.xml b/javaxval-2/pom.xml index 7d84b4ce9b..f73f23bcb2 100644 --- a/javaxval-2/pom.xml +++ b/javaxval-2/pom.xml @@ -25,6 +25,11 @@ ${spring.boot.version} test + + com.fasterxml.jackson.core + jackson-databind + ${jackson.databind.version} + @@ -39,6 +44,7 @@ 3.0.4 + 2.14.0 \ No newline at end of file diff --git a/javax-validation-advanced/src/main/java/com/baeldung/javaxval/afterdeserialization/BeanDeserializerModifierWithValidation.java b/javaxval-2/src/main/java/com/baeldung/javaxval/afterdeserialization/BeanDeserializerModifierWithValidation.java similarity index 97% rename from javax-validation-advanced/src/main/java/com/baeldung/javaxval/afterdeserialization/BeanDeserializerModifierWithValidation.java rename to javaxval-2/src/main/java/com/baeldung/javaxval/afterdeserialization/BeanDeserializerModifierWithValidation.java index 3e20ebad6b..f2425b542f 100644 --- a/javax-validation-advanced/src/main/java/com/baeldung/javaxval/afterdeserialization/BeanDeserializerModifierWithValidation.java +++ b/javaxval-2/src/main/java/com/baeldung/javaxval/afterdeserialization/BeanDeserializerModifierWithValidation.java @@ -1,20 +1,20 @@ -package com.baeldung.javaxval.afterdeserialization; - -import com.fasterxml.jackson.databind.BeanDescription; -import com.fasterxml.jackson.databind.DeserializationConfig; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.deser.BeanDeserializer; -import com.fasterxml.jackson.databind.deser.BeanDeserializerModifier; - -public class BeanDeserializerModifierWithValidation extends BeanDeserializerModifier { - - @Override - public JsonDeserializer modifyDeserializer(DeserializationConfig config, BeanDescription beanDesc, JsonDeserializer deserializer) { - if (deserializer instanceof BeanDeserializer) { - return new BeanDeserializerWithValidation((BeanDeserializer) deserializer); - } - - return deserializer; - } - -} +package com.baeldung.javaxval.afterdeserialization; + +import com.fasterxml.jackson.databind.BeanDescription; +import com.fasterxml.jackson.databind.DeserializationConfig; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.databind.deser.BeanDeserializer; +import com.fasterxml.jackson.databind.deser.BeanDeserializerModifier; + +public class BeanDeserializerModifierWithValidation extends BeanDeserializerModifier { + + @Override + public JsonDeserializer modifyDeserializer(DeserializationConfig config, BeanDescription beanDesc, JsonDeserializer deserializer) { + if (deserializer instanceof BeanDeserializer) { + return new BeanDeserializerWithValidation((BeanDeserializer) deserializer); + } + + return deserializer; + } + +} diff --git a/javax-validation-advanced/src/main/java/com/baeldung/javaxval/afterdeserialization/BeanDeserializerWithValidation.java b/javaxval-2/src/main/java/com/baeldung/javaxval/afterdeserialization/BeanDeserializerWithValidation.java similarity index 81% rename from javax-validation-advanced/src/main/java/com/baeldung/javaxval/afterdeserialization/BeanDeserializerWithValidation.java rename to javaxval-2/src/main/java/com/baeldung/javaxval/afterdeserialization/BeanDeserializerWithValidation.java index 332c83010d..178baaac95 100644 --- a/javax-validation-advanced/src/main/java/com/baeldung/javaxval/afterdeserialization/BeanDeserializerWithValidation.java +++ b/javaxval-2/src/main/java/com/baeldung/javaxval/afterdeserialization/BeanDeserializerWithValidation.java @@ -1,40 +1,40 @@ -package com.baeldung.javaxval.afterdeserialization; - -import java.io.IOException; -import java.util.Set; - -import javax.validation.ConstraintViolation; -import javax.validation.ConstraintViolationException; -import javax.validation.Validation; -import javax.validation.Validator; -import javax.validation.ValidatorFactory; - -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.deser.BeanDeserializer; -import com.fasterxml.jackson.databind.deser.BeanDeserializerBase; - -public class BeanDeserializerWithValidation extends BeanDeserializer { - - private static final ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); - private static final Validator validator = factory.getValidator(); - - protected BeanDeserializerWithValidation(BeanDeserializerBase src) { - super(src); - } - - @Override - public Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { - Object instance = super.deserialize(p, ctxt); - validate(instance); - return instance; - } - - public void validate(T t) { - Set> violations = validator.validate(t); - if (!violations.isEmpty()) { - throw new ConstraintViolationException(violations); - } - } - -} +package com.baeldung.javaxval.afterdeserialization; + +import java.io.IOException; +import java.util.Set; + +import jakarta.validation.ConstraintViolation; +import jakarta.validation.ConstraintViolationException; +import jakarta.validation.Validation; +import jakarta.validation.Validator; +import jakarta.validation.ValidatorFactory; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.deser.BeanDeserializer; +import com.fasterxml.jackson.databind.deser.BeanDeserializerBase; + +public class BeanDeserializerWithValidation extends BeanDeserializer { + + private static final ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); + private static final Validator validator = factory.getValidator(); + + protected BeanDeserializerWithValidation(BeanDeserializerBase src) { + super(src); + } + + @Override + public Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { + Object instance = super.deserialize(p, ctxt); + validate(instance); + return instance; + } + + public void validate(T t) { + Set> violations = validator.validate(t); + if (!violations.isEmpty()) { + throw new ConstraintViolationException(violations); + } + } + +} diff --git a/javax-validation-advanced/src/main/java/com/baeldung/javaxval/afterdeserialization/Student.java b/javaxval-2/src/main/java/com/baeldung/javaxval/afterdeserialization/Student.java similarity index 82% rename from javax-validation-advanced/src/main/java/com/baeldung/javaxval/afterdeserialization/Student.java rename to javaxval-2/src/main/java/com/baeldung/javaxval/afterdeserialization/Student.java index c1923de265..b359f67078 100644 --- a/javax-validation-advanced/src/main/java/com/baeldung/javaxval/afterdeserialization/Student.java +++ b/javaxval-2/src/main/java/com/baeldung/javaxval/afterdeserialization/Student.java @@ -1,14 +1,14 @@ -package com.baeldung.javaxval.afterdeserialization; - -import javax.validation.constraints.Size; - -public class Student { - - @Size(min = 5, max = 10, message = "Student's name must be between 5 and 10 characters") - private String name; - - public String getName() { - return name; - } - -} +package com.baeldung.javaxval.afterdeserialization; + +import jakarta.validation.constraints.Size; + +public class Student { + + @Size(min = 5, max = 10, message = "Student's name must be between 5 and 10 characters") + private String name; + + public String getName() { + return name; + } + +} diff --git a/javax-validation-advanced/src/main/java/com/baeldung/javaxval/afterdeserialization/StudentDeserializerWithValidation.java b/javaxval-2/src/main/java/com/baeldung/javaxval/afterdeserialization/StudentDeserializerWithValidation.java similarity index 97% rename from javax-validation-advanced/src/main/java/com/baeldung/javaxval/afterdeserialization/StudentDeserializerWithValidation.java rename to javaxval-2/src/main/java/com/baeldung/javaxval/afterdeserialization/StudentDeserializerWithValidation.java index e652a43ccb..588493782e 100644 --- a/javax-validation-advanced/src/main/java/com/baeldung/javaxval/afterdeserialization/StudentDeserializerWithValidation.java +++ b/javaxval-2/src/main/java/com/baeldung/javaxval/afterdeserialization/StudentDeserializerWithValidation.java @@ -1,24 +1,24 @@ -package com.baeldung.javaxval.afterdeserialization; - -import java.io.IOException; -import java.io.InputStream; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.module.SimpleModule; - -public class StudentDeserializerWithValidation { - - public static Student readStudent(InputStream inputStream) throws IOException { - ObjectMapper mapper = getObjectMapperWithValidation(); - return mapper.readValue(inputStream, Student.class); - } - - private static ObjectMapper getObjectMapperWithValidation() { - SimpleModule validationModule = new SimpleModule(); - validationModule.setDeserializerModifier(new BeanDeserializerModifierWithValidation()); - ObjectMapper mapper = new ObjectMapper(); - mapper.registerModule(validationModule); - return mapper; - } - -} +package com.baeldung.javaxval.afterdeserialization; + +import java.io.IOException; +import java.io.InputStream; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.module.SimpleModule; + +public class StudentDeserializerWithValidation { + + public static Student readStudent(InputStream inputStream) throws IOException { + ObjectMapper mapper = getObjectMapperWithValidation(); + return mapper.readValue(inputStream, Student.class); + } + + private static ObjectMapper getObjectMapperWithValidation() { + SimpleModule validationModule = new SimpleModule(); + validationModule.setDeserializerModifier(new BeanDeserializerModifierWithValidation()); + ObjectMapper mapper = new ObjectMapper(); + mapper.registerModule(validationModule); + return mapper; + } + +} diff --git a/javax-validation-advanced/src/test/java/com/baeldung/javaxval/StudentDeserializerWithValidationUnitTest.java b/javaxval-2/src/test/java/com/baeldung/javaxval/afterdeserialization/StudentDeserializerWithValidationUnitTest.java similarity index 95% rename from javax-validation-advanced/src/test/java/com/baeldung/javaxval/StudentDeserializerWithValidationUnitTest.java rename to javaxval-2/src/test/java/com/baeldung/javaxval/afterdeserialization/StudentDeserializerWithValidationUnitTest.java index edbe85ecfe..094236e963 100644 --- a/javax-validation-advanced/src/test/java/com/baeldung/javaxval/StudentDeserializerWithValidationUnitTest.java +++ b/javaxval-2/src/test/java/com/baeldung/javaxval/afterdeserialization/StudentDeserializerWithValidationUnitTest.java @@ -1,51 +1,51 @@ -package com.baeldung.javaxval; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; - -import java.io.IOException; -import java.io.InputStream; - -import javax.validation.ConstraintViolationException; - -import org.junit.jupiter.api.Test; - -import com.baeldung.javaxval.afterdeserialization.Student; -import com.baeldung.javaxval.afterdeserialization.StudentDeserializerWithValidation; - -public class StudentDeserializerWithValidationUnitTest { - - private final String EXPECTED_ERROR_MESSAGE = "name: Student's name must be between 5 and 10 characters"; - private final String EXPECTED_STUDENT_NAME = "Daniel"; - private final String NAME_TOO_LONG_STUDENT_FILE = "nameTooLongStudent.json"; - private final String NAME_TOO_SHORT_STUDENT_FILE = "nameTooShortStudent.json"; - private final String SUBDIRECTORY = "afterdeserialization/"; - private final String VALID_STUDENT_FILE = "validStudent.json"; - - @Test - void givenValidStudent_WhenReadStudent_ThenReturnStudent() throws IOException { - InputStream inputStream = getInputStream(VALID_STUDENT_FILE); - Student result = StudentDeserializerWithValidation.readStudent(inputStream); - assertEquals(EXPECTED_STUDENT_NAME, result.getName()); - } - - @Test - void givenStudentWithTooShortName_WhenReadStudent_ThenThrows() { - InputStream inputStream = getInputStream(NAME_TOO_SHORT_STUDENT_FILE); - ConstraintViolationException constraintViolationException = assertThrows(ConstraintViolationException.class, () -> StudentDeserializerWithValidation.readStudent(inputStream)); - assertEquals(EXPECTED_ERROR_MESSAGE, constraintViolationException.getMessage()); - } - - @Test - void givenStudentWithTooLongName_WhenReadStudent_ThenThrows() { - InputStream inputStream = getInputStream(NAME_TOO_LONG_STUDENT_FILE); - ConstraintViolationException constraintViolationException = assertThrows(ConstraintViolationException.class, () -> StudentDeserializerWithValidation.readStudent(inputStream)); - assertEquals(EXPECTED_ERROR_MESSAGE, constraintViolationException.getMessage()); - } - - private InputStream getInputStream(String fileName) { - return getClass().getClassLoader() - .getResourceAsStream(SUBDIRECTORY + fileName); - } - -} +package com.baeldung.javaxval; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.io.IOException; +import java.io.InputStream; + +import jakarta.validation.ConstraintViolationException; + +import org.junit.jupiter.api.Test; + +import com.baeldung.javaxval.afterdeserialization.Student; +import com.baeldung.javaxval.afterdeserialization.StudentDeserializerWithValidation; + +public class StudentDeserializerWithValidationUnitTest { + + private final String EXPECTED_ERROR_MESSAGE = "name: Student's name must be between 5 and 10 characters"; + private final String EXPECTED_STUDENT_NAME = "Daniel"; + private final String NAME_TOO_LONG_STUDENT_FILE = "nameTooLongStudent.json"; + private final String NAME_TOO_SHORT_STUDENT_FILE = "nameTooShortStudent.json"; + private final String SUBDIRECTORY = "afterdeserialization/"; + private final String VALID_STUDENT_FILE = "validStudent.json"; + + @Test + void givenValidStudent_WhenReadStudent_ThenReturnStudent() throws IOException { + InputStream inputStream = getInputStream(VALID_STUDENT_FILE); + Student result = StudentDeserializerWithValidation.readStudent(inputStream); + assertEquals(EXPECTED_STUDENT_NAME, result.getName()); + } + + @Test + void givenStudentWithTooShortName_WhenReadStudent_ThenThrows() { + InputStream inputStream = getInputStream(NAME_TOO_SHORT_STUDENT_FILE); + ConstraintViolationException constraintViolationException = assertThrows(ConstraintViolationException.class, () -> StudentDeserializerWithValidation.readStudent(inputStream)); + assertEquals(EXPECTED_ERROR_MESSAGE, constraintViolationException.getMessage()); + } + + @Test + void givenStudentWithTooLongName_WhenReadStudent_ThenThrows() { + InputStream inputStream = getInputStream(NAME_TOO_LONG_STUDENT_FILE); + ConstraintViolationException constraintViolationException = assertThrows(ConstraintViolationException.class, () -> StudentDeserializerWithValidation.readStudent(inputStream)); + assertEquals(EXPECTED_ERROR_MESSAGE, constraintViolationException.getMessage()); + } + + private InputStream getInputStream(String fileName) { + return getClass().getClassLoader() + .getResourceAsStream(SUBDIRECTORY + fileName); + } + +} diff --git a/javax-validation-advanced/src/test/resources/afterdeserialization/nameTooLongStudent.json b/javaxval-2/src/test/resources/afterdeserialization/nameTooLongStudent.json similarity index 93% rename from javax-validation-advanced/src/test/resources/afterdeserialization/nameTooLongStudent.json rename to javaxval-2/src/test/resources/afterdeserialization/nameTooLongStudent.json index e537ecb25d..486709db60 100644 --- a/javax-validation-advanced/src/test/resources/afterdeserialization/nameTooLongStudent.json +++ b/javaxval-2/src/test/resources/afterdeserialization/nameTooLongStudent.json @@ -1,3 +1,3 @@ -{ - "name": "Constantine" +{ + "name": "Constantine" } \ No newline at end of file diff --git a/javax-validation-advanced/src/test/resources/afterdeserialization/nameTooShortStudent.json b/javaxval-2/src/test/resources/afterdeserialization/nameTooShortStudent.json similarity index 90% rename from javax-validation-advanced/src/test/resources/afterdeserialization/nameTooShortStudent.json rename to javaxval-2/src/test/resources/afterdeserialization/nameTooShortStudent.json index 79ab10cb80..23410153e3 100644 --- a/javax-validation-advanced/src/test/resources/afterdeserialization/nameTooShortStudent.json +++ b/javaxval-2/src/test/resources/afterdeserialization/nameTooShortStudent.json @@ -1,3 +1,3 @@ -{ - "name": "Max" +{ + "name": "Max" } \ No newline at end of file diff --git a/javax-validation-advanced/src/test/resources/afterdeserialization/validStudent.json b/javaxval-2/src/test/resources/afterdeserialization/validStudent.json similarity index 91% rename from javax-validation-advanced/src/test/resources/afterdeserialization/validStudent.json rename to javaxval-2/src/test/resources/afterdeserialization/validStudent.json index 938002ea51..d106f7d7ce 100644 --- a/javax-validation-advanced/src/test/resources/afterdeserialization/validStudent.json +++ b/javaxval-2/src/test/resources/afterdeserialization/validStudent.json @@ -1,3 +1,3 @@ -{ - "name": "Daniel" +{ + "name": "Daniel" } \ No newline at end of file diff --git a/pom.xml b/pom.xml index bea9a5a6fa..a82f898689 100644 --- a/pom.xml +++ b/pom.xml @@ -850,7 +850,6 @@ javax-sound javaxval javaxval-2 - javax-validation-advanced jetbrains jgit jib @@ -1120,7 +1119,6 @@ javax-sound javaxval javaxval-2 - javax-validation-advanced jetbrains jgit jib