Velocity无法找到方法:Function类方法调用报错排查
问题分析与解决方案
这个报错的核心原因其实很容易被忽略——你的Function类没有声明为public!
在Java中,没有public修饰的类属于包级私有,只有同一个包内的代码才能访问它的成员,哪怕方法是public的。Velocity模板引擎在运行时是通过反射来调用对象方法的,而它的类加载上下文和你的com.stackoverflow包不在同一个访问范围内,所以哪怕你定义了getId()和getTitle()方法,Velocity也无法通过反射访问到它们。
另外,就算类是public的,Velocity其实更推荐使用属性式访问而非直接调用getter方法,这样模板代码会更简洁易读。
修复步骤:
- 给
Function类添加public修饰符(构造器也建议加上public,方便外部实例化):
package com.stackoverflow; public class Function { private final int id; private final String title; public Function(int id, String title) { this.id = id; this.title = title; } public int getId() { return this.id; } public String getTitle() { return this.title; } }
- 优化Velocity模板代码(可选,但更符合Velocity风格,同时修正下拉框选项值的正确用法):
<select class="form-control" id="detailFunction"> #foreach($function in $functions) <option value="$function.id">$function.title</option> #end </select>
补充说明:原来把
id放在<option>的id属性上意义不大,下拉框通常是通过value属性来传递选中值的,所以这里做了调整。
这样修改之后,不管你传入的是List<Function>还是Function[]类型的$functions,Velocity都能正常访问对象的属性/方法了。
内容的提问来源于stack exchange,提问作者Ward
相关产品推荐
相关产品推荐

