2015-07-16 4 views
0

Я использую модуль Play с Excel 1.2.3. В контроллере, я получаю список студентов путем вызова метода, определенного в модели - Студент:Воспроизводить странное поведение модуля Excel

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

findStudents() определяется как:

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

    return list; 
} 

тогда я сделать файл первенствовать по:

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. Студент лениво обращается к адресу

ответ

0

Jxls использует Apache Jexl для обработки выражений свойств, таких как stu.address.name. Jexl использует отражение для вычисления значений свойства объекта. Но отражение и ленивая загрузка не идут, потому что вы работаете не с реальным объектом, а с прокси-объектом.

Когда вы делаете System.out.println(student.address.name), создается реальный объект, и отражение отлично работает.

Возможное решение проблемы описано в этом ответе Converting Hibernate proxy to real object. Или вам просто нужно делать выборку, когда вам нужно передать объект в Jxls.

Смежные вопросы