Skip to content

Commit d5ad073

Browse files
committed
Add Validator.check() methods that return Set<ConstraintViolation> rather than throw
Technically we might not need this but I think it could be useful for applications that want to pre-validate messages before sending them etc.
1 parent dc5fc64 commit d5ad073

File tree

6 files changed

+73
-2
lines changed

6 files changed

+73
-2
lines changed

blackbox-test/src/test/java/example/avaje/length/ALengthTest.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,24 @@ class ALengthTest {
1616

1717
final Validator validator = Validator.builder().addLocales(Locale.GERMAN).build();
1818

19+
@Test
20+
void check() {
21+
var violations = validator.check(new ALength("ok", "ok", "ok", "ok"));
22+
assertThat(violations).isEmpty();
23+
}
24+
25+
@Test
26+
void checkOne() {
27+
var violations = validator.check(new ALength("", "ok", "ok", "ok"));
28+
assertThat(violations).hasSize(1);
29+
}
30+
31+
@Test
32+
void checkMulti() {
33+
var violations = validator.check(new ALength("", "123456", "e", "e"));
34+
assertThat(violations).hasSize(4);
35+
}
36+
1937
@Test
2038
void valid() {
2139
var cust = new ALength("ok", "ok", "ok", "ok");

validator/src/main/java/io/avaje/validation/Validator.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import java.time.Duration;
77
import java.util.Locale;
88
import java.util.ResourceBundle;
9+
import java.util.Set;
910
import java.util.function.Supplier;
1011

1112
import io.avaje.lang.Nullable;
@@ -48,6 +49,27 @@ public interface Validator {
4849
void validate(Object any, @Nullable Locale locale, @Nullable Class<?>... groups)
4950
throws ConstraintViolationException;
5051

52+
/**
53+
* Validate the object returning the constraint violations.
54+
*
55+
* @param any The object to validate
56+
* @param groups The groups targeted for validation
57+
*
58+
* @return The constraint violations
59+
*/
60+
Set<ConstraintViolation> check(Object any, @Nullable Class<?>... groups);
61+
62+
/**
63+
* Validate the object returning the constraint violations.
64+
*
65+
* @param any The object to validate
66+
* @param locale The locale to use for messages
67+
* @param groups The groups targeted for validation
68+
*
69+
* @return The constraint violations
70+
*/
71+
Set<ConstraintViolation> check(Object any, @Nullable Locale locale, @Nullable Class<?>... groups);
72+
5173
/** Return the validation context used to create adapters */
5274
ValidationContext context();
5375

validator/src/main/java/io/avaje/validation/adapter/ValidationRequest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package io.avaje.validation.adapter;
22

33
import java.util.List;
4+
import java.util.Set;
45

6+
import io.avaje.validation.ConstraintViolation;
57
import io.avaje.validation.ConstraintViolationException;
68

79
/** A validation request. */
@@ -27,6 +29,9 @@ public interface ValidationRequest {
2729
/** Throw ConstraintViolationException if there are violations in this request. */
2830
void throwWithViolations() throws ConstraintViolationException;
2931

32+
/** Return the violations */
33+
Set<ConstraintViolation> violations();
34+
3035
/** return true if there are violations in this request. */
3136
boolean hasViolations();
3237
}

validator/src/main/java/io/avaje/validation/core/DRequest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,11 @@ public void throwWithViolations() {
8080
}
8181
}
8282

83+
@Override
84+
public Set<ConstraintViolation> violations() {
85+
return violations;
86+
}
87+
8388
@Override
8489
public List<Class<?>> groups() {
8590
return groups;

validator/src/main/java/io/avaje/validation/core/DValidator.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import java.util.function.Supplier;
2424

2525
import io.avaje.lang.Nullable;
26+
import io.avaje.validation.ConstraintViolation;
2627
import io.avaje.validation.Validator;
2728
import io.avaje.validation.adapter.ValidationAdapter;
2829
import io.avaje.validation.adapter.ValidationContext;
@@ -78,6 +79,18 @@ public void validate(Object any, @Nullable Locale locale, @Nullable Class<?>...
7879
type.validate(any, locale, List.of(groups));
7980
}
8081

82+
@Override
83+
public Set<ConstraintViolation> check(Object any, @Nullable Class<?>... groups) {
84+
return check(any, null, groups);
85+
}
86+
87+
@Override
88+
@SuppressWarnings("unchecked")
89+
public Set<ConstraintViolation> check(Object any, @Nullable Locale locale, @Nullable Class<?>... groups) {
90+
final var type = (ValidationType<Object>) type(any.getClass());
91+
return type.check(any, locale, List.of(groups));
92+
}
93+
8194
@Override
8295
public ValidationContext context() {
8396
return this;

validator/src/main/java/io/avaje/validation/core/ValidationType.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22

33
import java.util.List;
44
import java.util.Locale;
5+
import java.util.Set;
56

67
import io.avaje.lang.Nullable;
8+
import io.avaje.validation.ConstraintViolation;
79
import io.avaje.validation.ConstraintViolationException;
810
import io.avaje.validation.adapter.ValidationAdapter;
911
import io.avaje.validation.adapter.ValidationContext;
@@ -13,15 +15,21 @@ final class ValidationType<T> {
1315
private final ValidationContext ctx;
1416
private final ValidationAdapter<T> adapter;
1517

16-
public ValidationType(ValidationContext validator, ValidationAdapter<T> adapter) {
18+
ValidationType(ValidationContext validator, ValidationAdapter<T> adapter) {
1719
this.ctx = validator;
1820
this.adapter = adapter;
1921
}
2022

21-
public void validate(T object, @Nullable Locale locale, List<Class<?>> groups)
23+
void validate(T object, @Nullable Locale locale, List<Class<?>> groups)
2224
throws ConstraintViolationException {
2325
final var req = ctx.request(locale, groups);
2426
adapter.validate(object, req);
2527
req.throwWithViolations();
2628
}
29+
30+
Set<ConstraintViolation> check(T object, @Nullable Locale locale, List<Class<?>> groups) {
31+
final var req = ctx.request(locale, groups);
32+
adapter.validate(object, req);
33+
return req.violations();
34+
}
2735
}

0 commit comments

Comments
 (0)