播放Excel模块奇怪的行为

时间:2015-07-16 10:07:05

标签: java excel hibernate playframework jxls

我正在使用Play with Excel模块1.2.3。在控制器中,我通过调用模型中定义的方法获得学生列表 - 学生:

List<Student> students= Student.findStudents();

findStudents()定义为:

public static List<Student> findStudents() {
    List<Student> list =  Student.find("colA != colB").fetch();

    return list;
}

然后我通过以下方式渲染excel文件:

renderExcel("student_report");

在excel模板中,我使用了JXLS。例如:

<jx:forEach items="${students}" var="stu">
    ${stu.address.name}                    ${stu.name}
</jx:forEach>

现在,奇怪的事情发生了。 stu.name始终显示正常。但是,stu.address.name仅在我在代码中执行System.out.println(student.address.name)之类的操作时才会显示。否则,Excel报告中的单元格为空白。

任何人都能解释一下吗?

N.B。学生懒洋洋地参与解决

1 个答案:

答案 0 :(得分:0)

Jxls使用Apache Jexl处理[PFUser currentUser]之类的属性表达式。 Jexl使用反射来计算对象属性值。 但反射和延迟加载并不适用,因为您不使用真实对象而是使用代理对象。

执行stu.address.name时,实例化实际对象并且反射正常。

此答案Converting Hibernate proxy to real object中描述了该问题的可能解决方案。或者,只要您需要将对象传递给Jxls,您就应该进行急切的提取。