Skip to content

Commit 685d2d4

Browse files
committed
Polish
See gh-30152
1 parent df417bf commit 685d2d4

File tree

8 files changed

+33
-464
lines changed

8 files changed

+33
-464
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jackson/JacksonAutoConfiguration.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@
4848
import org.springframework.boot.context.properties.EnableConfigurationProperties;
4949
import org.springframework.boot.jackson.JsonComponentModule;
5050
import org.springframework.boot.jackson.JsonMixinModule;
51-
import org.springframework.boot.jackson.JsonMixinScanPackages;
5251
import org.springframework.context.ApplicationContext;
5352
import org.springframework.context.annotation.Bean;
5453
import org.springframework.context.annotation.Configuration;
@@ -98,10 +97,8 @@ public JsonComponentModule jsonComponentModule() {
9897

9998
@Bean
10099
public JsonMixinModule jsonMixinModule(ApplicationContext context) {
101-
List<String> packages = JsonMixinScanPackages.get(context).getPackageNames();
102-
if (packages.isEmpty() && AutoConfigurationPackages.has(context)) {
103-
packages = AutoConfigurationPackages.get(context);
104-
}
100+
List<String> packages = AutoConfigurationPackages.has(context) ? AutoConfigurationPackages.get(context)
101+
: Collections.emptyList();
105102
return new JsonMixinModule(context, packages);
106103
}
107104

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jackson/JacksonAutoConfigurationTests.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,10 @@
4747
import com.fasterxml.jackson.databind.module.SimpleModule;
4848
import com.fasterxml.jackson.databind.util.StdDateFormat;
4949
import com.fasterxml.jackson.module.paramnames.ParameterNamesModule;
50+
import org.assertj.core.api.InstanceOfAssertFactories;
5051
import org.junit.jupiter.api.Test;
5152

53+
import org.springframework.boot.autoconfigure.AutoConfigurationPackage;
5254
import org.springframework.boot.autoconfigure.AutoConfigurations;
5355
import org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration;
5456
import org.springframework.boot.jackson.JsonComponent;
@@ -92,8 +94,13 @@ void doubleModuleRegistration() {
9294
}
9395

9496
@Test
95-
void jsonMixinModuleShouldBeAutoconfigured() {
96-
this.contextRunner.run((context) -> assertThat(context).hasSingleBean(JsonMixinModule.class));
97+
void jsonMixinModuleShouldBeAutoConfiguredWithBasePackages() {
98+
this.contextRunner.withUserConfiguration(MixinConfiguration.class).run((context) -> {
99+
assertThat(context).hasSingleBean(JsonMixinModule.class);
100+
JsonMixinModule module = context.getBean(JsonMixinModule.class);
101+
assertThat(module).extracting("basePackages", InstanceOfAssertFactories.list(String.class))
102+
.containsExactly(MixinConfiguration.class.getPackage().getName());
103+
});
97104
}
98105

99106
@Test
@@ -637,4 +644,9 @@ void setBirthDate(Date birthDate) {
637644

638645
}
639646

647+
@AutoConfigurationPackage
648+
static class MixinConfiguration {
649+
650+
}
651+
640652
}

spring-boot-project/spring-boot-docs/src/docs/asciidoc/features/json.adoc

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,14 @@ include::code:object/MyJsonComponent[]
4040

4141

4242

43+
[[features.json.jackson.mixins]]
44+
==== Mixins
45+
Jackson has support for mixins that can be used to mix additional annotations into those already declared on a target class.
46+
Spring Boot's Jackson auto-configuration will scan your application's packages for classes annotated with `@JsonMixin` and register them with the auto-configured `ObjectMapper`.
47+
The registration is performed by Spring Boot's `JsonMixinModule`.
48+
49+
50+
4351
[[features.json.gson]]
4452
=== Gson
4553
Auto-configuration for Gson is provided.

spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jackson/JsonMixinModule.java

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

1717
package org.springframework.boot.jackson;
1818

19-
import java.io.IOException;
2019
import java.util.Collection;
2120

2221
import com.fasterxml.jackson.databind.Module;
@@ -29,15 +28,16 @@
2928
import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
3029
import org.springframework.core.annotation.MergedAnnotation;
3130
import org.springframework.core.annotation.MergedAnnotations;
32-
import org.springframework.core.type.classreading.MetadataReader;
31+
import org.springframework.core.type.filter.AnnotationTypeFilter;
3332
import org.springframework.util.Assert;
3433
import org.springframework.util.ClassUtils;
3534
import org.springframework.util.ObjectUtils;
3635
import org.springframework.util.StringUtils;
3736

3837
/**
39-
* Spring Bean and Jackson {@link Module} to register {@link JsonMixin @JsonMixin}
40-
* annotated beans.
38+
* Spring Bean and Jackson {@link Module} to find and
39+
* {@link SimpleModule#setMixInAnnotation(Class, Class) register}
40+
* {@link JsonMixin @JsonMixin}-annotated classes.
4141
*
4242
* @author Guirong Hu
4343
* @since 2.7.0
@@ -68,7 +68,6 @@ public void afterPropertiesSet() throws Exception {
6868
JsonMixinComponentScanner scanner = new JsonMixinComponentScanner();
6969
scanner.setEnvironment(this.context.getEnvironment());
7070
scanner.setResourceLoader(this.context);
71-
7271
for (String basePackage : this.basePackages) {
7372
if (StringUtils.hasText(basePackage)) {
7473
for (BeanDefinition candidate : scanner.findCandidateComponents(basePackage)) {
@@ -81,25 +80,20 @@ public void afterPropertiesSet() throws Exception {
8180
private void addJsonMixin(Class<?> mixinClass) {
8281
MergedAnnotation<JsonMixin> annotation = MergedAnnotations
8382
.from(mixinClass, MergedAnnotations.SearchStrategy.TYPE_HIERARCHY).get(JsonMixin.class);
84-
Class<?>[] targetTypes = annotation.getClassArray("type");
85-
if (ObjectUtils.isEmpty(targetTypes)) {
86-
return;
87-
}
88-
for (Class<?> targetType : targetTypes) {
83+
for (Class<?> targetType : annotation.getClassArray("type")) {
8984
setMixInAnnotation(targetType, mixinClass);
9085
}
9186
}
9287

9388
static class JsonMixinComponentScanner extends ClassPathScanningCandidateComponentProvider {
9489

95-
@Override
96-
protected boolean isCandidateComponent(MetadataReader metadataReader) throws IOException {
97-
return true;
90+
JsonMixinComponentScanner() {
91+
addIncludeFilter(new AnnotationTypeFilter(JsonMixin.class));
9892
}
9993

10094
@Override
10195
protected boolean isCandidateComponent(AnnotatedBeanDefinition beanDefinition) {
102-
return beanDefinition.getMetadata().hasAnnotation(JsonMixin.class.getName());
96+
return true;
10397
}
10498

10599
}

spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jackson/JsonMixinScan.java

Lines changed: 0 additions & 75 deletions
This file was deleted.

0 commit comments

Comments
 (0)