From 292fc8f3b670f53a83f61cb2532c1e42acb3578f Mon Sep 17 00:00:00 2001 From: jameskleeh Date: Thu, 18 Feb 2021 12:42:05 -0500 Subject: [PATCH] Get the property name from the existing property if present. Fixes #4948 --- .../modules/BeanIntrospectionModule.java | 5 +-- .../BeanIntrospectionModuleSpec.groovy | 32 +++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/runtime/src/main/java/io/micronaut/jackson/modules/BeanIntrospectionModule.java b/runtime/src/main/java/io/micronaut/jackson/modules/BeanIntrospectionModule.java index 43c4d368ab1..d442262bef5 100644 --- a/runtime/src/main/java/io/micronaut/jackson/modules/BeanIntrospectionModule.java +++ b/runtime/src/main/java/io/micronaut/jackson/modules/BeanIntrospectionModule.java @@ -288,10 +288,11 @@ public SettableBeanProperty[] getFromObjectArguments(DeserializationConfig confi props = new SettableBeanProperty[constructorArguments.length]; for (int i = 0; i < constructorArguments.length; i++) { Argument argument = constructorArguments[i]; - final JavaType javaType = existing != null && existing.length > i ? existing[i].getType() : newType(argument, typeFactory); + SettableBeanProperty existingProperty = existing != null && existing.length > i ? existing[i] : null; + final JavaType javaType = existingProperty != null ? existingProperty.getType() : newType(argument, typeFactory); final AnnotationMetadata annotationMetadata = argument.getAnnotationMetadata(); PropertyMetadata propertyMetadata = newPropertyMetadata(argument, annotationMetadata); - final String simpleName = annotationMetadata.stringValue(JsonProperty.class).orElse(argument.getName()); + final String simpleName = existingProperty != null ? existingProperty.getName() : annotationMetadata.stringValue(JsonProperty.class).orElse(argument.getName()); TypeDeserializer typeDeserializer; try { typeDeserializer = config.findTypeDeserializer(javaType); diff --git a/runtime/src/test/groovy/io/micronaut/jackson/modules/BeanIntrospectionModuleSpec.groovy b/runtime/src/test/groovy/io/micronaut/jackson/modules/BeanIntrospectionModuleSpec.groovy index b7a805753a0..7f64474bb3a 100644 --- a/runtime/src/test/groovy/io/micronaut/jackson/modules/BeanIntrospectionModuleSpec.groovy +++ b/runtime/src/test/groovy/io/micronaut/jackson/modules/BeanIntrospectionModuleSpec.groovy @@ -6,7 +6,10 @@ import com.fasterxml.jackson.annotation.JsonProperty import com.fasterxml.jackson.annotation.JsonUnwrapped import com.fasterxml.jackson.annotation.JsonView import com.fasterxml.jackson.databind.ObjectMapper +import com.fasterxml.jackson.databind.PropertyNamingStrategy +import com.fasterxml.jackson.databind.annotation.JsonNaming import groovy.transform.EqualsAndHashCode +import groovy.transform.PackageScope import io.micronaut.context.ApplicationContext import io.micronaut.core.annotation.Introspected import io.micronaut.http.hateoas.JsonError @@ -21,6 +24,8 @@ import io.micronaut.jackson.modules.wrappers.LongWrapper import io.micronaut.jackson.modules.wrappers.StringWrapper import spock.lang.Specification +import java.beans.ConstructorProperties + class BeanIntrospectionModuleSpec extends Specification { void "Bean introspection works with a bean without JsonInclude annotations"() { @@ -281,6 +286,21 @@ class BeanIntrospectionModuleSpec extends Specification { ctx.close() } + void "test deserializing with a json naming strategy"() { + given: + ApplicationContext ctx = ApplicationContext.run() + ObjectMapper objectMapper = ctx.getBean(ObjectMapper) + + when: + NamingStrategy instance = objectMapper.readValue("{ \"FooBar\": \"bad\" }", NamingStrategy) + + then: + instance.fooBar == "bad" + + cleanup: + ctx.close() + } + @Introspected static class Book { @JsonProperty("book_title") @@ -356,4 +376,16 @@ class BeanIntrospectionModuleSpec extends Specification { static class PublicView {} static class AllView extends PublicView {} + @Introspected + @JsonNaming(PropertyNamingStrategy.UpperCamelCaseStrategy.class) + static class NamingStrategy { + + @PackageScope + final String fooBar + + @ConstructorProperties(["fooBar"]) + NamingStrategy(String fooBar) { + this.fooBar = fooBar + } + } }