Commit 6ba78490 authored by Vladimir Tsanev's avatar Vladimir Tsanev Committed by Stephane Nicoll

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
parent acda4f90
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
package org.springframework.boot.jackson; package org.springframework.boot.jackson;
import java.lang.reflect.Modifier;
import java.util.Map; import java.util.Map;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
...@@ -78,8 +79,9 @@ public class JsonComponentModule extends SimpleModule implements BeanFactoryAwar ...@@ -78,8 +79,9 @@ public class JsonComponentModule extends SimpleModule implements BeanFactoryAwar
addDeserializerWithDeducedType((JsonDeserializer<?>) bean); addDeserializerWithDeducedType((JsonDeserializer<?>) bean);
} }
for (Class<?> innerClass : bean.getClass().getDeclaredClasses()) { for (Class<?> innerClass : bean.getClass().getDeclaredClasses()) {
if (JsonSerializer.class.isAssignableFrom(innerClass) if (!Modifier.isAbstract(innerClass.getModifiers()) &&
|| JsonDeserializer.class.isAssignableFrom(innerClass)) { (JsonSerializer.class.isAssignableFrom(innerClass)
|| JsonDeserializer.class.isAssignableFrom(innerClass))) {
try { try {
addJsonBean(innerClass.newInstance()); addJsonBean(innerClass.newInstance());
} }
......
...@@ -59,6 +59,15 @@ public class JsonComponentModuleTests { ...@@ -59,6 +59,15 @@ public class JsonComponentModuleTests {
context.close(); 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 { private void assertSerialize(Module module) throws Exception {
ObjectMapper mapper = new ObjectMapper(); ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(module); mapper.registerModule(module);
...@@ -85,4 +94,15 @@ public class JsonComponentModuleTests { ...@@ -85,4 +94,15 @@ public class JsonComponentModuleTests {
} }
@JsonComponent
static class ComponentWithInnerAbstractClass {
private static abstract class AbstractSerializer extends NameAndAgeJsonComponent.Serializer {
}
static class ConcreteSerializer extends AbstractSerializer {
}
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment