Skip to content

Commit fe5bd67

Browse files
committed
Retain default LocalVariableTableParameterNameDiscoverer with warn log entries
For a transition period, LocalVariableTableParameterNameDiscoverer logs a warning for each successful resolution attempt now, suggesting that -parameters was missed. See gh-29531 See gh-29559
1 parent ed5ab77 commit fe5bd67

File tree

5 files changed

+25
-28
lines changed

5 files changed

+25
-28
lines changed

spring-core/src/main/java/org/springframework/core/DefaultParameterNameDiscoverer.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@
1818

1919
/**
2020
* Default implementation of the {@link ParameterNameDiscoverer} strategy interface,
21-
* delegating to the Java 8 standard reflection mechanism.
21+
* delegating to the Java 8 standard reflection mechanism, with a deprecated fallback
22+
* to {@link LocalVariableTableParameterNameDiscoverer}.
2223
*
2324
* <p>If a Kotlin reflection implementation is present,
2425
* {@link KotlinReflectionParameterNameDiscoverer} is added first in the list and
@@ -35,11 +36,20 @@
3536
*/
3637
public class DefaultParameterNameDiscoverer extends PrioritizedParameterNameDiscoverer {
3738

39+
@SuppressWarnings("removal")
3840
public DefaultParameterNameDiscoverer() {
3941
if (KotlinDetector.isKotlinReflectPresent()) {
4042
addDiscoverer(new KotlinReflectionParameterNameDiscoverer());
4143
}
44+
45+
// Recommended approach on Java 8+: compilation with -parameters.
4246
addDiscoverer(new StandardReflectionParameterNameDiscoverer());
47+
48+
// Deprecated fallback to class file parsing for -debug symbols.
49+
// Does not work on native images without class file resources.
50+
if (!NativeDetector.inNativeImage()) {
51+
addDiscoverer(new LocalVariableTableParameterNameDiscoverer());
52+
}
4353
}
4454

4555
}

spring-core/src/main/java/org/springframework/core/LocalVariableTableParameterNameDiscoverer.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@
5656
* @deprecated as of 6.0.1, in favor of {@link StandardReflectionParameterNameDiscoverer}
5757
* (with the "-parameters" compiler flag)
5858
*/
59-
@Deprecated(since = "6.0.1")
59+
@Deprecated(since = "6.0.1", forRemoval = true)
6060
public class LocalVariableTableParameterNameDiscoverer implements ParameterNameDiscoverer {
6161

6262
private static final Log logger = LogFactory.getLog(LocalVariableTableParameterNameDiscoverer.class);
@@ -85,7 +85,12 @@ public String[] getParameterNames(Constructor<?> ctor) {
8585
private String[] doGetParameterNames(Executable executable) {
8686
Class<?> declaringClass = executable.getDeclaringClass();
8787
Map<Executable, String[]> map = this.parameterNamesCache.computeIfAbsent(declaringClass, this::inspectClass);
88-
return (map != NO_DEBUG_INFO_MAP ? map.get(executable) : null);
88+
String[] names = (map != NO_DEBUG_INFO_MAP ? map.get(executable) : null);
89+
if (names != null && logger.isWarnEnabled()) {
90+
logger.warn("Using deprecated '-debug' fallback for parameter name resolution. " +
91+
"Compile the affected code with '-parameters' instead: " + executable);
92+
}
93+
return names;
8994
}
9095

9196
/**

spring-core/src/main/java/org/springframework/core/ReactiveAdapterRegistry.java

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2021 the original author or authors.
2+
* Copyright 2002-2022 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -339,11 +339,7 @@ void registerAdapters(ReactiveAdapterRegistry registry) {
339339

340340
/**
341341
* {@code BlockHoundIntegration} for spring-core classes.
342-
* <p>Explicitly allow the following:
343-
* <ul>
344-
* <li>Reading class info via {@link LocalVariableTableParameterNameDiscoverer}.
345-
* <li>Locking within {@link ConcurrentReferenceHashMap}.
346-
* </ul>
342+
* Explicitly allows locking within {@link ConcurrentReferenceHashMap}.
347343
* @since 5.2.4
348344
*/
349345
public static class SpringCoreBlockHoundIntegration implements BlockHoundIntegration {
@@ -352,9 +348,6 @@ public static class SpringCoreBlockHoundIntegration implements BlockHoundIntegra
352348
public void applyTo(BlockHound.Builder builder) {
353349
// Avoid hard references potentially anywhere in spring-core (no need for structural dependency)
354350

355-
builder.allowBlockingCallsInside(
356-
"org.springframework.core.LocalVariableTableParameterNameDiscoverer", "inspectClass");
357-
358351
String className = "org.springframework.util.ConcurrentReferenceHashMap$Segment";
359352
builder.allowBlockingCallsInside(className, "doTask");
360353
builder.allowBlockingCallsInside(className, "clear");

spring-core/src/test/java/org/springframework/core/LocalVariableTableParameterNameDiscovererTests.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2019 the original author or authors.
2+
* Copyright 2002-2022 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -34,7 +34,8 @@
3434
*/
3535
class LocalVariableTableParameterNameDiscovererTests {
3636

37-
private final LocalVariableTableParameterNameDiscoverer discoverer = new LocalVariableTableParameterNameDiscoverer();
37+
@SuppressWarnings("removal")
38+
private final ParameterNameDiscoverer discoverer = new LocalVariableTableParameterNameDiscoverer();
3839

3940

4041
@Test

spring-core/src/test/java/org/springframework/core/SpringCoreBlockHoundIntegrationTests.java

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

1717
package org.springframework.core;
1818

19-
import java.lang.reflect.Method;
2019
import java.util.Map;
2120
import java.util.concurrent.CompletableFuture;
2221

@@ -28,7 +27,6 @@
2827
import reactor.core.scheduler.ReactorBlockHoundIntegration;
2928
import reactor.core.scheduler.Schedulers;
3029

31-
import org.springframework.tests.sample.objects.TestObject;
3230
import org.springframework.util.ConcurrentReferenceHashMap;
3331

3432
import static org.assertj.core.api.Assertions.assertThat;
@@ -52,11 +50,10 @@
5250
@DisabledOnJre(value= {JRE.JAVA_18, JRE.JAVA_19}, disabledReason = "BlockHound is not compatible with Java 18+")
5351
class SpringCoreBlockHoundIntegrationTests {
5452

55-
5653
@BeforeAll
57-
static void setUp() {
54+
static void setup() {
5855
BlockHound.builder()
59-
.with(new ReactorBlockHoundIntegration()) // Reactor non-blocking thread predicate
56+
.with(new ReactorBlockHoundIntegration()) // Reactor non-blocking thread predicate
6057
.with(new ReactiveAdapterRegistry.SpringCoreBlockHoundIntegration())
6158
.install();
6259
}
@@ -68,15 +65,6 @@ void blockHoundIsInstalled() {
6865
.hasMessageContaining("Blocking call!");
6966
}
7067

71-
@Test
72-
void localVariableTableParameterNameDiscoverer() {
73-
testNonBlockingTask(() -> {
74-
Method setName = TestObject.class.getMethod("setName", String.class);
75-
String[] names = new LocalVariableTableParameterNameDiscoverer().getParameterNames(setName);
76-
assertThat(names).containsExactly("name");
77-
});
78-
}
79-
8068
@Test
8169
void concurrentReferenceHashMap() {
8270
int size = 10000;

0 commit comments

Comments
 (0)