Skip to content

Commit f9ccfc1

Browse files
committed
Register Encoding on ReflectionHints for binding
Closes gh-31528
1 parent 750e0aa commit f9ccfc1

File tree

2 files changed

+31
-0
lines changed

2 files changed

+31
-0
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/http/HttpMessageConvertersAutoConfiguration.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818

1919
import java.util.stream.Collectors;
2020

21+
import org.springframework.aot.hint.RuntimeHints;
22+
import org.springframework.aot.hint.RuntimeHintsRegistrar;
2123
import org.springframework.beans.factory.ObjectProvider;
2224
import org.springframework.boot.autoconfigure.AutoConfiguration;
2325
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
@@ -27,15 +29,18 @@
2729
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication.Type;
2830
import org.springframework.boot.autoconfigure.condition.NoneNestedConditions;
2931
import org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration;
32+
import org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration.HttpMessageConvertersAutoConfigurationRuntimeHints;
3033
import org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration.NotReactiveWebApplicationCondition;
3134
import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration;
3235
import org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration;
36+
import org.springframework.boot.context.properties.ConfigurationPropertiesReflectionHintsProcessor;
3337
import org.springframework.boot.context.properties.bind.Binder;
3438
import org.springframework.boot.web.servlet.server.Encoding;
3539
import org.springframework.context.annotation.Bean;
3640
import org.springframework.context.annotation.Conditional;
3741
import org.springframework.context.annotation.Configuration;
3842
import org.springframework.context.annotation.Import;
43+
import org.springframework.context.annotation.ImportRuntimeHints;
3944
import org.springframework.core.env.Environment;
4045
import org.springframework.http.converter.HttpMessageConverter;
4146
import org.springframework.http.converter.StringHttpMessageConverter;
@@ -60,6 +65,7 @@
6065
@Conditional(NotReactiveWebApplicationCondition.class)
6166
@Import({ JacksonHttpMessageConvertersConfiguration.class, GsonHttpMessageConvertersConfiguration.class,
6267
JsonbHttpMessageConvertersConfiguration.class })
68+
@ImportRuntimeHints(HttpMessageConvertersAutoConfigurationRuntimeHints.class)
6369
public class HttpMessageConvertersAutoConfiguration {
6470

6571
static final String PREFERRED_MAPPER_PROPERTY = "spring.mvc.converters.preferred-json-mapper";
@@ -98,4 +104,14 @@ private static class ReactiveWebApplication {
98104

99105
}
100106

107+
static class HttpMessageConvertersAutoConfigurationRuntimeHints implements RuntimeHintsRegistrar {
108+
109+
@Override
110+
public void registerHints(RuntimeHints hints, ClassLoader classLoader) {
111+
ConfigurationPropertiesReflectionHintsProcessor.processConfigurationProperties(Encoding.class,
112+
hints.reflection());
113+
}
114+
115+
}
116+
101117
}

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/http/HttpMessageConvertersAutoConfigurationTests.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,13 @@
2323
import jakarta.json.bind.Jsonb;
2424
import org.junit.jupiter.api.Test;
2525

26+
import org.springframework.aot.hint.MemberCategory;
27+
import org.springframework.aot.hint.RuntimeHints;
28+
import org.springframework.aot.hint.predicate.RuntimeHintsPredicates;
2629
import org.springframework.beans.factory.config.BeanDefinition;
2730
import org.springframework.boot.autoconfigure.AutoConfigurations;
2831
import org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration;
32+
import org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration.HttpMessageConvertersAutoConfigurationRuntimeHints;
2933
import org.springframework.boot.autoconfigure.http.JacksonHttpMessageConvertersConfiguration.MappingJackson2HttpMessageConverterConfiguration;
3034
import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration;
3135
import org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration;
@@ -36,6 +40,7 @@
3640
import org.springframework.boot.test.context.runner.ContextConsumer;
3741
import org.springframework.boot.test.context.runner.ReactiveWebApplicationContextRunner;
3842
import org.springframework.boot.test.context.runner.WebApplicationContextRunner;
43+
import org.springframework.boot.web.servlet.server.Encoding;
3944
import org.springframework.context.annotation.Bean;
4045
import org.springframework.context.annotation.Configuration;
4146
import org.springframework.context.support.GenericApplicationContext;
@@ -61,6 +66,7 @@
6166
* @author Andy Wilkinson
6267
* @author Sebastien Deleuze
6368
* @author Eddú Meléndez
69+
* @author Moritz Halbritter
6470
*/
6571
class HttpMessageConvertersAutoConfigurationTests {
6672

@@ -271,6 +277,15 @@ void whenAutoConfigurationIsActiveThenServerPropertiesConfigurationPropertiesAre
271277
});
272278
}
273279

280+
@Test
281+
void shouldRegisterHints() {
282+
RuntimeHints hints = new RuntimeHints();
283+
new HttpMessageConvertersAutoConfigurationRuntimeHints().registerHints(hints, getClass().getClassLoader());
284+
assertThat(RuntimeHintsPredicates.reflection().onType(Encoding.class)
285+
.withMemberCategories(MemberCategory.INVOKE_DECLARED_METHODS, MemberCategory.INVOKE_PUBLIC_METHODS))
286+
.accepts(hints);
287+
}
288+
274289
private ApplicationContextRunner allOptionsRunner() {
275290
return this.contextRunner.withConfiguration(AutoConfigurations.of(GsonAutoConfiguration.class,
276291
JacksonAutoConfiguration.class, JsonbAutoConfiguration.class));

0 commit comments

Comments
 (0)