Skip to content

Commit

Permalink
Added path information to failing class level validations (#938)
Browse files Browse the repository at this point in the history
* Added path information to failing class level validations

* Post-review changes

- Path elements are separated by a '.'
- Constraints are imported individually

* Reverted separation of path information and violationPath by a space instead of a dot.

---------

Co-authored-by: btanguay <[email protected]>
  • Loading branch information
BenjaminTanguay and BenjaminTanguay authored May 25, 2023
1 parent ada692c commit 25b7045
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ default void validateMapping(
if (mappingInterface != null) {
validateMappingInterface(mappingInterface, prefix, mappingInterface.getNamingStrategy(), mappingObject, problems);
} else {
validateMappingClass(mappingObject, problems);
validateMappingClass(mappingObject, problems, prefix);
}

if (!problems.isEmpty()) {
Expand All @@ -63,7 +63,7 @@ default void validateMappingInterface(
validateProperty(property, currentPath, namingStrategy, mappingObject, false, problems);
}

validateMappingClass(mappingObject, problems);
validateMappingClass(mappingObject, problems, currentPath);
}

default void validateProperty(
Expand Down Expand Up @@ -225,11 +225,15 @@ default void validatePropertyValue(
}
}

default void validateMappingClass(final Object mappingObject, final List<Problem> problems) {
default void validateMappingClass(
final Object mappingObject,
final List<Problem> problems,
final String currentPath) {
final Set<ConstraintViolation<Object>> violations = getValidator().validate(mappingObject);
for (ConstraintViolation<Object> violation : violations) {
problems.add(violation.getPropertyPath().toString().isEmpty() ? new Problem(violation.getMessage())
: new Problem(violation.getPropertyPath() + " " + violation.getMessage()));
problems.add(
violation.getPropertyPath().toString().isEmpty() ? new Problem(currentPath + " " + violation.getMessage())
: new Problem(currentPath + " " + violation.getPropertyPath() + " " + violation.getMessage()));
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
import jakarta.validation.Payload;
import jakarta.validation.constraints.AssertTrue;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
Expand Down Expand Up @@ -85,6 +86,8 @@ void validateConfigMapping() {
"server.cors.origins[0].port", "9000",
"server.cors.origins[1].host", "localhost",
"server.cors.origins[1].port", "1",
"server.cors.origins[2].host", "server3",
"server.cors.origins[2].port", "4",
"server.cors.methods[0]", "GET",
"server.cors.methods[1]", "POST",
"server.info.name", "Bond",
Expand All @@ -109,9 +112,10 @@ void validateConfigMapping() {
"server.log.levels all identifiers must have the same length",
"server.log.levels.ERROR.importance must be greater than or equal to 0",
"server.proxy.timeout must be less than or equal to 10",
"server.cors.origins size must be between 3 and 2147483647",
"server.cors.origins size must be between 4 and 2147483647",
"server.cors.origins[0].host size must be between 0 and 10",
"server.cors.origins[0].port must be less than or equal to 10",
"server.cors.origins[2] someClassLevelCrossValidation If host is server3, then port value must be 3",
"server.cors.methods[1] size must be between 0 and 3",
"server.cors.methods size must be between 3 and 2147483647",
"server.form.login-page size must be between 0 and 3",
Expand All @@ -124,7 +128,7 @@ void validateConfigMapping() {
"server.info.admins.root[1].username size must be between 0 and 4",
"server.info.admins.root size must be between 0 and 1",
"server.info.firewall.accepted[1] size must be between 8 and 15",
"server is not prod");
"server server is not prod");
}

@Test
Expand Down Expand Up @@ -159,7 +163,7 @@ void validateConfigProperties() {
assertEquals(1, validationException.getProblemCount());
List<String> validations = new ArrayList<>();
validations.add(validationException.getProblem(0).getMessage());
assertTrue(validations.contains("port must be less than or equal to 10"));
assertTrue(validations.contains("client port must be less than or equal to 10"));
}

@Test
Expand Down Expand Up @@ -220,7 +224,7 @@ interface LogLevel {
}

interface Cors {
@Size(min = 3)
@Size(min = 4)
List<Origin> origins();

@Size(min = 3)
Expand All @@ -232,6 +236,11 @@ interface Origin {

@Max(10)
int port();

@AssertTrue(message = "If host is server3, then port value must be 3")
private boolean isSomeClassLevelCrossValidation() {
return !"server3".equals(host()) || port() == 3;
}
}
}

Expand Down

0 comments on commit 25b7045

Please sign in to comment.