diff --git a/spring-web/src/main/java/org/springframework/http/codec/CodecConfigurerHintsRegistrar.java b/spring-web/src/main/java/org/springframework/http/codec/CodecConfigurerHintsRegistrar.java new file mode 100644 index 00000000000..cbc7b1d5f7d --- /dev/null +++ b/spring-web/src/main/java/org/springframework/http/codec/CodecConfigurerHintsRegistrar.java @@ -0,0 +1,46 @@ +/* + * Copyright 2002-2022 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.http.codec; + +import org.springframework.aot.hint.MemberCategory; +import org.springframework.aot.hint.RuntimeHints; +import org.springframework.aot.hint.RuntimeHintsRegistrar; +import org.springframework.aot.hint.TypeReference; +import org.springframework.http.codec.support.DefaultClientCodecConfigurer; +import org.springframework.http.codec.support.DefaultServerCodecConfigurer; +import org.springframework.lang.Nullable; + +/** + * {@link RuntimeHintsRegistrar} implementation that registers runtime hints for + * implementations listed in {@code CodecConfigurer.properties}. + * + * @author Sebastien Deleuze + * @since 6.0 + */ +public class CodecConfigurerHintsRegistrar implements RuntimeHintsRegistrar { + + @Override + public void registerHints(RuntimeHints hints, @Nullable ClassLoader classLoader) { + hints.resources().registerPattern("org/springframework/http/codec/CodecConfigurer.properties"); + hints.reflection().registerType(DefaultClientCodecConfigurer.class, builder -> + builder.onReachableType(TypeReference.of(CodecConfigurerFactory.class)) + .withMembers(MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS)); + hints.reflection().registerType(DefaultServerCodecConfigurer.class, builder -> + builder.onReachableType(TypeReference.of(CodecConfigurerFactory.class)) + .withMembers(MemberCategory.INVOKE_PUBLIC_CONSTRUCTORS)); + } +} diff --git a/spring-web/src/main/resources/META-INF/spring/aot.factories b/spring-web/src/main/resources/META-INF/spring/aot.factories index 8b8f795777b..d2fb0e5d144 100644 --- a/spring-web/src/main/resources/META-INF/spring/aot.factories +++ b/spring-web/src/main/resources/META-INF/spring/aot.factories @@ -1,2 +1,3 @@ org.springframework.aot.hint.RuntimeHintsRegistrar= \ -org.springframework.http.MediaTypeResourceHintsRegistrar \ No newline at end of file +org.springframework.http.MediaTypeResourceHintsRegistrar,\ +org.springframework.http.codec.CodecConfigurerHintsRegistrar \ No newline at end of file diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/config/WebFluxConfigurationSupport.java b/spring-webflux/src/main/java/org/springframework/web/reactive/config/WebFluxConfigurationSupport.java index 12baba94d9a..740d62384ed 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/config/WebFluxConfigurationSupport.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/config/WebFluxConfigurationSupport.java @@ -28,6 +28,7 @@ import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ImportRuntimeHints; import org.springframework.core.ReactiveAdapterRegistry; import org.springframework.core.annotation.Order; import org.springframework.core.convert.converter.Converter; @@ -45,6 +46,7 @@ import org.springframework.validation.Errors; import org.springframework.validation.MessageCodesResolver; import org.springframework.validation.Validator; import org.springframework.web.bind.WebDataBinder; +import org.springframework.web.bind.annotation.WebAnnotationsRuntimeHintsRegistrar; import org.springframework.web.bind.support.ConfigurableWebBindingInitializer; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.reactive.DispatcherHandler; @@ -83,6 +85,7 @@ import org.springframework.web.server.i18n.LocaleContextResolver; * @author Brian Clozel * @since 5.0 */ +@ImportRuntimeHints(WebAnnotationsRuntimeHintsRegistrar.class) public class WebFluxConfigurationSupport implements ApplicationContextAware { @Nullable