From eeb48cc9461d731ae289c3ae36eb65e34a26225f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sevket=20Go=CC=88kay?= Date: Sat, 31 Jan 2026 19:11:47 +0100 Subject: [PATCH] refactor to use BeanDeserializerBase, DelegatingDeserializer --- ...eanDeserializerModifierWithValidation.java | 7 ++-- .../BeanDeserializerWithValidation.java | 42 ++++++++++++------- 2 files changed, 31 insertions(+), 18 deletions(-) diff --git a/ocpp-jaxb/src/main/java/de/rwth/idsg/ocpp/jaxb/validation/BeanDeserializerModifierWithValidation.java b/ocpp-jaxb/src/main/java/de/rwth/idsg/ocpp/jaxb/validation/BeanDeserializerModifierWithValidation.java index 211a0de..c1a3125 100644 --- a/ocpp-jaxb/src/main/java/de/rwth/idsg/ocpp/jaxb/validation/BeanDeserializerModifierWithValidation.java +++ b/ocpp-jaxb/src/main/java/de/rwth/idsg/ocpp/jaxb/validation/BeanDeserializerModifierWithValidation.java @@ -5,9 +5,8 @@ import tools.jackson.databind.DeserializationConfig; import tools.jackson.databind.ValueDeserializer; import tools.jackson.databind.deser.ValueDeserializerModifier; -import tools.jackson.databind.deser.bean.BeanDeserializer; +import tools.jackson.databind.deser.bean.BeanDeserializerBase; -import jakarta.validation.Validation; import jakarta.validation.Validator; /** @@ -22,8 +21,8 @@ public class BeanDeserializerModifierWithValidation extends ValueDeserializerMod public ValueDeserializer modifyDeserializer(DeserializationConfig config, Supplier beanDescRef, ValueDeserializer deserializer) { - if (deserializer instanceof BeanDeserializer) { - return new BeanDeserializerWithValidation((BeanDeserializer) deserializer, validator); + if (deserializer instanceof BeanDeserializerBase) { + return new BeanDeserializerWithValidation((BeanDeserializerBase) deserializer, validator); } return deserializer; diff --git a/ocpp-jaxb/src/main/java/de/rwth/idsg/ocpp/jaxb/validation/BeanDeserializerWithValidation.java b/ocpp-jaxb/src/main/java/de/rwth/idsg/ocpp/jaxb/validation/BeanDeserializerWithValidation.java index 895563c..750adde 100644 --- a/ocpp-jaxb/src/main/java/de/rwth/idsg/ocpp/jaxb/validation/BeanDeserializerWithValidation.java +++ b/ocpp-jaxb/src/main/java/de/rwth/idsg/ocpp/jaxb/validation/BeanDeserializerWithValidation.java @@ -3,7 +3,9 @@ import tools.jackson.core.JacksonException; import tools.jackson.core.JsonParser; import tools.jackson.databind.DeserializationContext; -import tools.jackson.databind.deser.bean.BeanDeserializer; +import tools.jackson.databind.ValueDeserializer; +import tools.jackson.databind.deser.bean.BeanDeserializerBase; +import tools.jackson.databind.deser.std.DelegatingDeserializer; import jakarta.validation.ConstraintViolationException; import jakarta.validation.Validator; @@ -11,24 +13,36 @@ /** * https://www.baeldung.com/java-object-validation-deserialization */ -public class BeanDeserializerWithValidation extends BeanDeserializer { +public class BeanDeserializerWithValidation extends DelegatingDeserializer { - private final Validator validator; - - public BeanDeserializerWithValidation(BeanDeserializer src, Validator validator) { - super(src); - this.validator = validator; + public BeanDeserializerWithValidation(BeanDeserializerBase d, Validator validator) { + super(create(d, validator)); } @Override - public Object deserialize(JsonParser p, DeserializationContext ctxt) throws JacksonException { - var instance = super.deserialize(p, ctxt); + protected ValueDeserializer newDelegatingInstance(ValueDeserializer newDelegatee) { + return newDelegatee; + } + + private static ValueDeserializer create(ValueDeserializer delegate, Validator validator) { + return new ValueDeserializer<>() { + + @Override + public Class handledType() { + return delegate.handledType(); // otherwise NPE in constructor of DelegatingDeserializer + } + + @Override + public Object deserialize(JsonParser p, DeserializationContext ctxt) throws JacksonException { + var instance = delegate.deserialize(p, ctxt); - var violations = validator.validate(instance); - if (!violations.isEmpty()) { - throw new ConstraintViolationException(violations); - } + var violations = validator.validate(instance); + if (!violations.isEmpty()) { + throw new ConstraintViolationException(violations); + } - return instance; + return instance; + } + }; } }