From d1470bbb25954e640b9d7473b701d9841e775876 Mon Sep 17 00:00:00 2001 From: junhyeong9812 Date: Thu, 2 Jul 2026 07:52:25 +0900 Subject: [PATCH] Register native configuration file when only lambda hints are present Prior to this commit, FileNativeConfigurationWriter did not write reachability-metadata.json when a RuntimeHints instance contained only lambda hints, because NativeConfigurationWriter.hasAnyHint() omitted ReflectionHints.lambdaHints() from its checks. As a result, lambda metadata emitted by RuntimeHintsWriter was silently dropped. This commit addresses that by including lambda hints in hasAnyHint() so the configuration file is written whenever lambda hints are present. Closes gh-36989 Signed-off-by: junhyeong9812 --- .../nativex/NativeConfigurationWriter.java | 1 + .../FileNativeConfigurationWriterTests.java | 29 +++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/spring-core/src/main/java/org/springframework/aot/nativex/NativeConfigurationWriter.java b/spring-core/src/main/java/org/springframework/aot/nativex/NativeConfigurationWriter.java index b2a583f056d..e360b741f5c 100644 --- a/spring-core/src/main/java/org/springframework/aot/nativex/NativeConfigurationWriter.java +++ b/spring-core/src/main/java/org/springframework/aot/nativex/NativeConfigurationWriter.java @@ -46,6 +46,7 @@ public abstract class NativeConfigurationWriter { private boolean hasAnyHint(RuntimeHints hints) { return (hints.proxies().jdkProxyHints().findAny().isPresent() || hints.reflection().typeHints().findAny().isPresent() || + hints.reflection().lambdaHints().findAny().isPresent() || hints.resources().resourcePatternHints().findAny().isPresent() || hints.resources().resourceBundleHints().findAny().isPresent() || hints.jni().typeHints().findAny().isPresent() || diff --git a/spring-core/src/test/java/org/springframework/aot/nativex/FileNativeConfigurationWriterTests.java b/spring-core/src/test/java/org/springframework/aot/nativex/FileNativeConfigurationWriterTests.java index 834c2c962b7..e1d83b544c0 100644 --- a/spring-core/src/test/java/org/springframework/aot/nativex/FileNativeConfigurationWriterTests.java +++ b/spring-core/src/test/java/org/springframework/aot/nativex/FileNativeConfigurationWriterTests.java @@ -23,6 +23,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.function.Consumer; import java.util.function.Function; +import java.util.function.Supplier; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; @@ -137,6 +138,34 @@ class FileNativeConfigurationWriterTests { """); } + @Test // gh-36989 + void lambdaConfig() throws Exception { + FileNativeConfigurationWriter generator = new FileNativeConfigurationWriter(tempDir); + RuntimeHints hints = new RuntimeHints(); + hints.reflection().registerLambda(Integer.class, builder -> builder + .withDeclaringMethod("getCell", Integer.class, Integer.class) + .withInterfaces(Supplier.class)); + generator.write(hints); + assertEquals(""" + { + "reflection": [ + { + "type": { + "lambda": { + "declaringClass": "java.lang.Integer", + "declaringMethod": { + "name": "getCell", + "parameterTypes": [ "java.lang.Integer", "java.lang.Integer" ] + }, + "interfaces": [ "java.util.function.Supplier" ] + } + } + } + ] + } + """); + } + @Test void jniConfig() throws Exception { // same format as reflection so just test basic file generation