将项目从SpringBootv2.7迁移到v3.0 (因此从SpringIntegrationv5.5迁移到v6.0)后,将输出以下警告:
WARN 22084 --- [ restartedMain] ocalVariableTableParameterNameDiscoverer : Using deprecated '-debug' fallback for parameter name resolution. Compile the affected code with '-parameters' instead or avoid its introspection: com.foobar.MyClassA
WARN 22084 --- [ restartedMain] ocalVariableTableParameterNameDiscoverer : Using deprecated '-debug' fallback for parameter name resolution. Compile the affected code with '-parameters' instead or avoid its introspection: com.foobar.MyClassB
WARN 22084 --- [ restartedMain] ocalVariableTableParameterNameDiscoverer : Using deprecated '-debug' fallback for parameter name resolution. Compile the affected code with '-parameters' instead or avoid its introspection: com.foobar.MyClassC
WARN 22084 --- [ restartedMain] ocalVariableTableParameterNameDiscoverer : Using deprecated '-debug' fallback for parameter name resolution. Compile the affected code with '-parameters' instead or avoid its introspection: com.foobar.MyClassD
MyClassA
扩展了IntegrationFlowAdapter
,并使用@Component
进行注释。
package com.foobar;
@Component
class MyClassA extends IntegrationFlowAdapter {
// …
}
MyClassB
用@ConfigurationProperties
注释
package com.foobar;
@ConfigurationProperties("my-config")
class MyClassB {
// …
}
MyClassC
用@Configuration
注释
package com.foobar;
@Configuration
class MyClassC {
// …
}
这个特别的甚至没有扩展任何东西,也没有注释:
package com.foobar;
class MyClassD {
// …
}
我在Spring Boot和弹簧集成迁移指南中没有看到任何相关信息。Spring迁移指南中有一个关于名称解析的部分,但是它与Gradle有关,我正在使用Maven。我甚至不知道这个名字决议是怎么回事。
我对类LocalVariableTableParameterNameDiscoverer
感到困惑,我也不知道我应该做什么迁移任务。
发布于 2022-11-28 14:14:47
正如由@m-deinum指出在问题中所指出的,这个问题与Spring或Spring无关,而是与Spring本身有关。我需要将-parameters
选项添加到javac
中。
如果您正在使用Maven,那么在pom.xml
中添加以下内容应该可以解决这个问题:
<project>
<!-- … -->
<build>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version>
<configuration>
<compilerArgs>
<arg>-parameters</arg>
</compilerArgs>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
<!-- … -->
</project>
发布于 2022-11-28 14:15:22
这在某种程度上与无关,两者都不是Spring。这种变化发生在Spring本身:https://github.com/spring-projects/spring-framework/issues/29563中。
是的,Spring使用LocalVariableTableParameterNameDiscoverer
在MessagePublishingInterceptor
for @Publisher
中将方法参数作为SpEL EvaluationContext
:https://docs.spring.io/spring-integration/docs/current/reference/html/message-publishing.html#message-publishing中的PublisherMetadataSource.ARGUMENT_MAP_VARIABLE_NAME
变量。
另一个是@MessagingGateway
,如果不为该注释提供name
属性,则尝试解析@Header
方法params中的标头名称:https://docs.spring.io/spring-integration/docs/current/reference/html/messaging-endpoints.html#mapping-method-arguments
MessagingMethodInvokerHelper
中存在类似的逻辑来解析POJO服务方法的头名:https://docs.spring.io/spring-integration/docs/current/reference/html/configuration.html#annotations
因此,我们需要从Spring配置中获得更多信息,以确定可能的位置,只需将name
属性添加到方法param上的@Header
注释中。
我还看到这个LocalVariableTableParameterNameDiscoverer
在6.0.1
中被废弃了。请提出一个针对Spring的GH问题,因此我们将修复它以支持上述的StandardReflectionParameterNameDiscoverer
。
发布于 2022-12-04 13:12:22
这些警告告诉您,LocalVariableTableParameterNameDiscoverer
类正在使用不推荐的方法进行参数名称解析。Spring使用这个类来发现代码中方法参数的名称。为了修复这些警告,您需要使用-parameters
标志而不是-debug
标志编译代码。
要对Maven执行此操作,需要将-parameters
标志添加到maven-compiler-plugin
的pom.xml
文件中的pom.xml
属性中。下面是一个如何做到这一点的例子:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<compilerArgs>
<arg>-parameters</arg>
</compilerArgs>
</configuration>
</plugin>
</plugins>
</build>
在进行此更改后,重新编译代码,并且警告将不再出现。
至于名称解析本身,这是Spring在代码中确定方法参数名称的过程。默认情况下,方法参数的名称不存储在编译后的Java代码中,因此,如果要在Spring配置中使用这些名称,则需要启用某种类型的名称解析。-parameters
标志是这样做的一种方式,而-debug
标志是另一种(被废弃的)方式。建议使用-parameters
标志来实现这一点,因为它提供了更准确和更有效的名称解析。
https://stackoverflow.com/questions/74600681
复制相似问题