Skip to content

Commit 46888f9

Browse files
authored
Merge pull request #30 from steve-community/impl-various-strictness-modes
implement "strictness modes" for bean validation
2 parents 93b870b + 8f8a217 commit 46888f9

File tree

7 files changed

+73
-18
lines changed

7 files changed

+73
-18
lines changed

ocpp-jaxb/src/main/java/de/rwth/idsg/ocpp/jaxb/validation/BeanDeserializerModifierWithValidation.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,14 @@
1616
public class BeanDeserializerModifierWithValidation extends ValueDeserializerModifier {
1717

1818
private final Validator validator;
19+
private final StrictnessMode strictnessMode;
1920

2021
@Override
2122
public ValueDeserializer<?> modifyDeserializer(DeserializationConfig config,
2223
Supplier beanDescRef,
2324
ValueDeserializer<?> deserializer) {
2425
if (deserializer instanceof BeanDeserializerBase) {
25-
return new BeanDeserializerWithValidation(deserializer, validator);
26+
return new BeanDeserializerWithValidation(deserializer, validator, strictnessMode);
2627
}
2728

2829
return deserializer;

ocpp-jaxb/src/main/java/de/rwth/idsg/ocpp/jaxb/validation/BeanDeserializerWithValidation.java

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package de.rwth.idsg.ocpp.jaxb.validation;
22

3+
import lombok.extern.slf4j.Slf4j;
34
import tools.jackson.core.JacksonException;
45
import tools.jackson.core.JsonParser;
56
import tools.jackson.databind.DeserializationContext;
@@ -13,18 +14,22 @@
1314
/**
1415
* https://www.baeldung.com/java-object-validation-deserialization
1516
*/
17+
@Slf4j
1618
public class BeanDeserializerWithValidation extends DelegatingDeserializer {
1719

1820
private final Validator validator;
21+
private final StrictnessMode strictnessMode;
1922

20-
protected BeanDeserializerWithValidation(ValueDeserializer<?> delegate, Validator validator) {
23+
protected BeanDeserializerWithValidation(ValueDeserializer<?> delegate, Validator validator,
24+
StrictnessMode strictnessMode) {
2125
super(delegate);
2226
this.validator = validator;
27+
this.strictnessMode = strictnessMode;
2328
}
2429

2530
@Override
2631
protected ValueDeserializer<?> newDelegatingInstance(ValueDeserializer<?> newDelegate) {
27-
return new BeanDeserializerWithValidation(newDelegate, validator);
32+
return new BeanDeserializerWithValidation(newDelegate, validator, strictnessMode);
2833
}
2934

3035
@Override
@@ -50,8 +55,14 @@ public Object deserializeWithType(JsonParser p, DeserializationContext ctxt, Typ
5055

5156
private <T> void validate(T object) {
5257
var violations = validator.validate(object);
53-
if (!violations.isEmpty()) {
54-
throw new ConstraintViolationException(violations);
58+
if (violations.isEmpty()) {
59+
return;
60+
}
61+
62+
var exception = new ConstraintViolationException(violations);
63+
switch (strictnessMode) {
64+
case LogWarning -> log.warn("There are constraint violations", exception);
65+
case ThrowError -> throw exception;
5566
}
5667
}
5768
}

ocpp-jaxb/src/main/java/de/rwth/idsg/ocpp/jaxb/validation/BeanSerializerModifierWithValidation.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,14 @@
1313
public class BeanSerializerModifierWithValidation extends ValueSerializerModifier {
1414

1515
private final Validator validator;
16+
private final StrictnessMode strictnessMode;
1617

1718
@Override
1819
public ValueSerializer<?> modifySerializer(SerializationConfig config,
1920
BeanDescription.Supplier beanDesc,
2021
ValueSerializer<?> serializer) {
2122
if (serializer instanceof BeanSerializerBase) {
22-
return new BeanSerializerWithValidation((BeanSerializerBase) serializer, validator);
23+
return new BeanSerializerWithValidation((BeanSerializerBase) serializer, validator, strictnessMode);
2324
}
2425

2526
return serializer;
Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package de.rwth.idsg.ocpp.jaxb.validation;
22

33
import lombok.RequiredArgsConstructor;
4+
import lombok.extern.slf4j.Slf4j;
45
import tools.jackson.core.JacksonException;
56
import tools.jackson.core.JsonGenerator;
67
import tools.jackson.databind.SerializationContext;
@@ -10,20 +11,31 @@
1011
import jakarta.validation.ConstraintViolationException;
1112
import jakarta.validation.Validator;
1213

14+
@Slf4j
1315
@RequiredArgsConstructor
1416
public class BeanSerializerWithValidation extends ValueSerializer<Object> {
1517

1618
private final BeanSerializerBase delegate;
1719
private final Validator validator;
20+
private final StrictnessMode strictnessMode;
1821

1922
@Override
2023
public void serialize(Object bean, JsonGenerator gen, SerializationContext ctxt) throws JacksonException {
21-
var violations = validator.validate(bean);
22-
if (!violations.isEmpty()) {
23-
throw new ConstraintViolationException(violations);
24+
validate(bean);
25+
delegate.serialize(bean, gen, ctxt);
26+
}
27+
28+
private <T> void validate(T object) {
29+
var violations = validator.validate(object);
30+
if (violations.isEmpty()) {
31+
return;
2432
}
2533

26-
delegate.serialize(bean, gen, ctxt);
34+
var exception = new ConstraintViolationException(violations);
35+
switch (strictnessMode) {
36+
case LogWarning -> log.warn("There are constraint violations", exception);
37+
case ThrowError -> throw exception;
38+
}
2739
}
2840

2941
}
Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package de.rwth.idsg.ocpp.jaxb.validation;
22

3+
import lombok.Builder;
34
import tools.jackson.databind.module.SimpleModule;
45

56
import jakarta.validation.Validation;
@@ -10,30 +11,47 @@
1011
*/
1112
public class BeanValidationModule extends SimpleModule {
1213

13-
private BeanValidationModule(Validator validator, boolean forReading, boolean forWriting) {
14+
@Builder
15+
private BeanValidationModule(Validator validator, StrictnessMode readingMode, StrictnessMode writingMode) {
16+
if (readingMode == null && writingMode == null) {
17+
throw new NullPointerException("readingMode and writingMode are null");
18+
}
19+
1420
Validator validatorToUse = validator == null
1521
? Validation.buildDefaultValidatorFactory().getValidator()
1622
: validator;
1723

18-
if (forReading) {
19-
setDeserializerModifier(new BeanDeserializerModifierWithValidation(validatorToUse));
24+
if (readingMode != null) {
25+
setDeserializerModifier(new BeanDeserializerModifierWithValidation(validatorToUse, readingMode));
2026
}
2127

22-
if (forWriting) {
23-
setSerializerModifier(new BeanSerializerModifierWithValidation(validatorToUse));
28+
if (writingMode != null) {
29+
setSerializerModifier(new BeanSerializerModifierWithValidation(validatorToUse, writingMode));
2430
}
2531
}
2632

2733
public static BeanValidationModule forReading(Validator validator) {
28-
return new BeanValidationModule(validator, true, false);
34+
return BeanValidationModule.builder()
35+
.validator(validator)
36+
.readingMode(StrictnessMode.ThrowError)
37+
.writingMode(null)
38+
.build();
2939
}
3040

3141
public static BeanValidationModule forWriting(Validator validator) {
32-
return new BeanValidationModule(validator, false, true);
42+
return BeanValidationModule.builder()
43+
.validator(validator)
44+
.readingMode(null)
45+
.writingMode(StrictnessMode.ThrowError)
46+
.build();
3347
}
3448

3549
public static BeanValidationModule forReadingAndWriting(Validator validator) {
36-
return new BeanValidationModule(validator, true, true);
50+
return BeanValidationModule.builder()
51+
.validator(validator)
52+
.readingMode(StrictnessMode.ThrowError)
53+
.writingMode(StrictnessMode.ThrowError)
54+
.build();
3755
}
3856

3957
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package de.rwth.idsg.ocpp.jaxb.validation;
2+
3+
public enum StrictnessMode {
4+
LogWarning,
5+
ThrowError
6+
}

pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,12 @@
130130
<artifactId>lombok</artifactId>
131131
<version>${lombok.version}</version>
132132
</dependency>
133+
<dependency>
134+
<groupId>org.slf4j</groupId>
135+
<artifactId>slf4j-api</artifactId>
136+
<version>2.0.17</version>
137+
<scope>compile</scope>
138+
</dependency>
133139

134140
<!-- Jackson 3.x components rely on 2.x annotations; there are no separate 3.x jackson-annotations -->
135141
<dependency>

0 commit comments

Comments
 (0)