33import com .fasterxml .jackson .annotation .JsonSubTypes ;
44import com .fasterxml .jackson .core .JsonParser ;
55import com .fasterxml .jackson .databind .DeserializationContext ;
6+ import com .fasterxml .jackson .databind .JsonDeserializer ;
67import com .fasterxml .jackson .databind .JsonMappingException ;
7- import com .fasterxml .jackson .databind .deser .std .StdDeserializer ;
88import java .io .IOException ;
99import java .util .ArrayList ;
1010import java .util .List ;
11+ import javax .annotation .Nonnull ;
1112
1213/**
1314 * Handles polymorphic deserialization for a base class or interface.
1415 *
15- * <p>This deserializer attempts to deserialize JSON into a subtype of a base class or interface.
16- * Subtypes are either discovered using the {@link JsonSubTypes} annotation or provided explicitly.
17- * If deserialization fails for all candidates, a {@link JsonMappingException} is thrown with
18- * suppressed exceptions.
16+ * <p>This deserializer uses a fallback strategy by attempting to deserialize the JSON into known
17+ * subtypes. Subtypes are either discovered using the {@link JsonSubTypes} annotation or provided
18+ * explicitly. If deserialization fails for all candidates, a {@link JsonMappingException} is thrown
19+ * with suppressed exceptions.
1920 *
2021 * @param <T> The base type for deserialization.
2122 */
22- public class PolymorphicFallbackDeserializer <T > extends StdDeserializer <T > {
23+ public class PolymorphicFallbackDeserializer <T > extends JsonDeserializer <T > {
2324
24- private final List <Class <? extends T >> candidates ;
25+ @ Nonnull private final List <Class <? extends T >> candidates ;
26+ Class <T > baseClass ;
2527
2628 /**
2729 * Constructs the deserializer using the {@link JsonSubTypes} annotation.
2830 *
2931 * @param baseClass The base class or interface to be resolved.
3032 * @throws IllegalStateException If no subtypes are found.
3133 */
32- protected PolymorphicFallbackDeserializer (Class <T > baseClass ) {
33- super ( baseClass ) ;
34+ protected PolymorphicFallbackDeserializer (@ Nonnull final Class <T > baseClass ) {
35+ this . baseClass = baseClass ;
3436
3537 final var subTypes = baseClass .getAnnotation (JsonSubTypes .class );
3638 if (subTypes == null || subTypes .value ().length == 0 ) {
@@ -50,8 +52,8 @@ protected PolymorphicFallbackDeserializer(Class<T> baseClass) {
5052 * @param candidates A list of candidate classes to try deserialization.
5153 */
5254 protected PolymorphicFallbackDeserializer (
53- Class <T > baseClass , List <Class <? extends T >> candidates ) {
54- super ( baseClass ) ;
55+ @ Nonnull final Class <T > baseClass , @ Nonnull final List <Class <? extends T >> candidates ) {
56+ this . baseClass = baseClass ;
5557 this .candidates = candidates ;
5658 }
5759
@@ -62,17 +64,20 @@ protected PolymorphicFallbackDeserializer(
6264 * @param deserializationContext The deserialization context.
6365 * @return The deserialized object of a matching candidate type.
6466 * @throws JsonMappingException If deserialization fails for all candidates.
65- * @throws IOException If an I/O error occurs .
67+ * @throws IOException If json content cannot be consumed .
6668 */
69+ @ Nonnull
6770 @ Override
68- public T deserialize (JsonParser jsonParser , DeserializationContext deserializationContext )
71+ public T deserialize (
72+ @ Nonnull final JsonParser jsonParser ,
73+ @ Nonnull final DeserializationContext deserializationContext )
6974 throws IOException {
7075
7176 final var root = jsonParser .readValueAsTree ();
7277 final var throwable =
7378 JsonMappingException .from (
7479 jsonParser ,
75- "PolymorphicFallbackDeserializer failed to deserialize " + handledType () .getName ());
80+ "PolymorphicFallbackDeserializer failed to deserialize " + this . baseClass .getName ());
7681
7782 for (final var candidate : candidates ) {
7883 try {
0 commit comments