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 4ce308af..a8de3563 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 e037ac4e..34a4e230 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); + } + } }