From f033631b97cdf6978208ab274f65f19b5928b506 Mon Sep 17 00:00:00 2001 From: Arne Limburg Date: Mon, 29 Jun 2026 19:07:50 +0200 Subject: [PATCH] JOHNZON-431: Add detection of annotations at class level for constructor parameters --- .../apache/johnzon/jsonb/JsonbAccessMode.java | 6 ++- .../johnzon/jsonb/JsonbAdapterTest.java | 48 +++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JsonbAccessMode.java b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JsonbAccessMode.java index 4ce308af3..a8de35639 100644 --- a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JsonbAccessMode.java +++ b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JsonbAccessMode.java @@ -1051,7 +1051,11 @@ private static T getAnnotation(final Parameter param, fin if (annotation != null) { return annotation; } - return Meta.findMeta(param.getAnnotations(), api); + final T metaAnnotation = Meta.findMeta(param.getAnnotations(), api); + if (metaAnnotation != null) { + return metaAnnotation; + } + return Meta.getAnnotation(param.getType(), api); } @Override diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/JsonbAdapterTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/JsonbAdapterTest.java index e037ac4e1..34a4e230c 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/JsonbAdapterTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/JsonbAdapterTest.java @@ -23,6 +23,9 @@ import org.junit.Test; import jakarta.json.bind.adapter.JsonbAdapter; +import jakarta.json.bind.annotation.JsonbCreator; +import jakarta.json.bind.annotation.JsonbProperty; +import jakarta.json.bind.annotation.JsonbTypeAdapter; import static org.junit.Assert.assertEquals; @@ -43,6 +46,18 @@ public void testInheritedAdapterRecognized() { assertEquals("\"#336699\"", json); } + @Test + public void adapterAtConstructorParameterRecognized() { + // given + String json = "{\"innerValue\": \"value\"}"; + + // when + OuterObject object = jsonbRule.fromJson(json, OuterObject.class); + + // then + assertEquals("value", object.innerObject.value); + } + interface ValueType { T value(); } @@ -76,4 +91,37 @@ public ColorId adaptFromJson(String s) throws Exception { return new ColorId(s); } } + + public static class OuterObject { + + private InnerObject innerObject; + + @JsonbCreator + public OuterObject(@JsonbProperty("innerValue") InnerObject object) { + innerObject = object; + } + } + + @JsonbTypeAdapter(InnerObjectAdapter.class) + static class InnerObject { + + private String value; + + public InnerObject(String value) { + this.value = value; + } + } + + public static class InnerObjectAdapter implements JsonbAdapter { + + @Override + public String adaptToJson(InnerObject object) throws Exception { + return object.value; + } + + @Override + public InnerObject adaptFromJson(String value) throws Exception { + return new InnerObject(value); + } + } }