From 6ba7849094ccbf3321e01f2369fb5c12a3756f21 Mon Sep 17 00:00:00 2001 From: Vladimir Tsanev Date: Fri, 9 Jun 2017 11:09:52 +0300 Subject: [PATCH] Allow abstract serializers/deserializer in @JsonComponent Previously JsonComponentModule tried to instantiate all inner classes and failed with InstantiationException when the class is abstract and extends JsonSerializer/JsonDeserializer. With this change is now possible to have common logic inner abstract classes. See gh-9443 --- .../boot/jackson/JsonComponentModule.java | 6 ++++-- .../jackson/JsonComponentModuleTests.java | 20 +++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/spring-boot/src/main/java/org/springframework/boot/jackson/JsonComponentModule.java b/spring-boot/src/main/java/org/springframework/boot/jackson/JsonComponentModule.java index 33f9041ca9..4467d24893 100644 --- a/spring-boot/src/main/java/org/springframework/boot/jackson/JsonComponentModule.java +++ b/spring-boot/src/main/java/org/springframework/boot/jackson/JsonComponentModule.java @@ -16,6 +16,7 @@ package org.springframework.boot.jackson; +import java.lang.reflect.Modifier; import java.util.Map; import javax.annotation.PostConstruct; @@ -78,8 +79,9 @@ public class JsonComponentModule extends SimpleModule implements BeanFactoryAwar addDeserializerWithDeducedType((JsonDeserializer) bean); } for (Class innerClass : bean.getClass().getDeclaredClasses()) { - if (JsonSerializer.class.isAssignableFrom(innerClass) - || JsonDeserializer.class.isAssignableFrom(innerClass)) { + if (!Modifier.isAbstract(innerClass.getModifiers()) && + (JsonSerializer.class.isAssignableFrom(innerClass) + || JsonDeserializer.class.isAssignableFrom(innerClass))) { try { addJsonBean(innerClass.newInstance()); } diff --git a/spring-boot/src/test/java/org/springframework/boot/jackson/JsonComponentModuleTests.java b/spring-boot/src/test/java/org/springframework/boot/jackson/JsonComponentModuleTests.java index 03d3b78d59..b3bd49028d 100644 --- a/spring-boot/src/test/java/org/springframework/boot/jackson/JsonComponentModuleTests.java +++ b/spring-boot/src/test/java/org/springframework/boot/jackson/JsonComponentModuleTests.java @@ -59,6 +59,15 @@ public class JsonComponentModuleTests { context.close(); } + @Test + public void moduleShouldAllowInnerAbstractClasses() throws Exception { + AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext( + JsonComponentModule.class, ComponentWithInnerAbstractClass.class); + JsonComponentModule module = context.getBean(JsonComponentModule.class); + assertSerialize(module); + context.close(); + } + private void assertSerialize(Module module) throws Exception { ObjectMapper mapper = new ObjectMapper(); mapper.registerModule(module); @@ -85,4 +94,15 @@ public class JsonComponentModuleTests { } + @JsonComponent + static class ComponentWithInnerAbstractClass { + + private static abstract class AbstractSerializer extends NameAndAgeJsonComponent.Serializer { + + } + + static class ConcreteSerializer extends AbstractSerializer { + + } + } }