Merge pull request #9443 from tsachev:gh-9442
* pr/9443: Polish Polish "Allow abstract serializers/deserializer in @JsonComponent" Allow abstract serializers/deserializer in @JsonComponent
This commit is contained in:
commit
5538fbaae2
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2012-2016 the original author or authors.
|
* Copyright 2012-2017 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
|
@ -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
|
||||||
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());
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2012-2016 the original author or authors.
|
* Copyright 2012-2017 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
|
@ -18,6 +18,7 @@ package org.springframework.boot.jackson;
|
||||||
|
|
||||||
import com.fasterxml.jackson.databind.Module;
|
import com.fasterxml.jackson.databind.Module;
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
import org.junit.After;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
|
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
|
||||||
|
|
@ -31,34 +32,54 @@ import static org.assertj.core.api.Assertions.assertThat;
|
||||||
*/
|
*/
|
||||||
public class JsonComponentModuleTests {
|
public class JsonComponentModuleTests {
|
||||||
|
|
||||||
|
private AnnotationConfigApplicationContext context;
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void closeContext() {
|
||||||
|
if (this.context != null) {
|
||||||
|
this.context.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void moduleShouldRegisterSerializers() throws Exception {
|
public void moduleShouldRegisterSerializers() throws Exception {
|
||||||
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(
|
load(OnlySerializer.class);
|
||||||
JsonComponentModule.class, OnlySerializer.class);
|
JsonComponentModule module = this.context.getBean(JsonComponentModule.class);
|
||||||
JsonComponentModule module = context.getBean(JsonComponentModule.class);
|
|
||||||
assertSerialize(module);
|
assertSerialize(module);
|
||||||
context.close();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void moduleShouldRegisterDeserializers() throws Exception {
|
public void moduleShouldRegisterDeserializers() throws Exception {
|
||||||
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(
|
load(OnlyDeserializer.class);
|
||||||
JsonComponentModule.class, OnlyDeserializer.class);
|
JsonComponentModule module = this.context.getBean(JsonComponentModule.class);
|
||||||
JsonComponentModule module = context.getBean(JsonComponentModule.class);
|
|
||||||
assertDeserialize(module);
|
assertDeserialize(module);
|
||||||
context.close();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void moduleShouldRegisterInnerClasses() throws Exception {
|
public void moduleShouldRegisterInnerClasses() throws Exception {
|
||||||
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(
|
load(NameAndAgeJsonComponent.class);
|
||||||
JsonComponentModule.class, NameAndAgeJsonComponent.class);
|
JsonComponentModule module = this.context.getBean(JsonComponentModule.class);
|
||||||
JsonComponentModule module = context.getBean(JsonComponentModule.class);
|
|
||||||
assertSerialize(module);
|
assertSerialize(module);
|
||||||
assertDeserialize(module);
|
assertDeserialize(module);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void moduleShouldAllowInnerAbstractClasses() throws Exception {
|
||||||
|
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(
|
||||||
|
JsonComponentModule.class, ComponentWithInnerAbstractClass.class);
|
||||||
|
JsonComponentModule module = context.getBean(JsonComponentModule.class);
|
||||||
|
assertSerialize(module);
|
||||||
context.close();
|
context.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void load(Class<?>... configs) {
|
||||||
|
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
|
||||||
|
ctx.register(configs);
|
||||||
|
ctx.register(JsonComponentModule.class);
|
||||||
|
ctx.refresh();
|
||||||
|
this.context = ctx;
|
||||||
|
}
|
||||||
|
|
||||||
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 +106,15 @@ public class JsonComponentModuleTests {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@JsonComponent
|
||||||
|
static class ComponentWithInnerAbstractClass {
|
||||||
|
|
||||||
|
private static abstract class AbstractSerializer extends NameAndAgeJsonComponent.Serializer {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static class ConcreteSerializer extends AbstractSerializer {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue