无法在调试符号中启用参数名,需配置Ant javac支持SpEL运行
解决SpEL无法识别方法参数名的问题
这个问题我之前也碰到过!核心原因在于Java 7及更早版本的javac默认不会将方法参数名编译到class文件的可反射元数据中——哪怕你开了debug="true"和debuglevel="lines,vars,source",这些配置只是保留了调试用的局部变量信息,而非供反射(比如SpEL)调用的参数名数据。
下面给你两种可行的解决方案:
方案1:升级到Java 8+(推荐)
从Java 8开始,javac新增了-parameters编译参数,专门用来将方法参数名嵌入class文件的元数据中,这样SpEL就能直接通过参数名引用了。你只需要修改Ant的javac任务,添加这个编译参数,并对应升级Java版本配置:
<javac includeantruntime="false" srcdir="src;gen" destdir="build/compiled" deprecation="on" target="1.8" <!-- 升级到Java 8目标版本 --> source="1.8" <!-- 对应源码版本 --> debug="true" debuglevel="lines,vars,source" verbose="false" classpathref="project.classpath"> <!-- 添加这行传递-parameters参数 --> <compilerarg value="-parameters"/> </javac>
修改完成后重新编译项目,SpEL就能正常识别方法参数名了。
方案2:留在Java 7的替代方案
如果因为项目限制必须使用Java 7,那你有两个替代选择:
- 使用位置参数引用:在SpEL表达式里用
#arg0、#arg1这种索引式的参数名(第一个参数是arg0,第二个是arg1,以此类推)。 - 添加参数注解:给方法参数加上
@org.springframework.data.repository.query.Param注解(或自定义类似注解),然后在SpEL里用注解指定的名称引用。示例代码:
之后SpEL里就能用public void handleUser(@Param("username") String username, @Param("age") int age) { // 业务逻辑 }#username和#age来引用对应参数了。
内容的提问来源于stack exchange,提问作者usr-local-ΕΨΗΕΛΩΝ
相关产品推荐
相关产品推荐

