2015-07-16 1 views
0

J'utilise Jouer avec le module Excel 1.2.3. Dans un contrôleur, je reçois une liste des étudiants en appelant une méthode définie dans le modèle - Student:Jouer comportement bizarre Module Excel

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

findStudents() est défini comme:

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

    return list; 
} 

je rends le fichier Excel par:

renderExcel("student_report"); 

A l'intérieur du modèle Excel, j'ai utilisé JXLS. Par exemple:

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

Maintenant, la chose étrange se produit. stu.name toujours bien affiché. Cependant, stu.address.name ne s'affiche que lorsque j'ai fait quelque chose comme System.out.println(student.address.name) dans le code. Sinon, la cellule du rapport Excel est vide.

Quelqu'un peut-il expliquer cela?

N.B. Ref étudiant paresseusement pour répondre

Répondre

0

Jxls utilise Apache Jexl pour traiter des expressions de propriété comme stu.address.name. Jexl utilise la réflexion pour calculer les valeurs de la propriété de l'objet. Mais la réflexion et le chargement paresseux ne vont pas de pair car vous ne travaillez pas avec un objet réel mais avec un objet proxy.

Lorsque vous faites System.out.println(student.address.name) l'objet réel est instancié et la réflexion fonctionne très bien.

solution possible à la question est décrite dans cette réponse Converting Hibernate proxy to real object. Ou vous devriez juste chercher ardemment quand vous avez besoin de passer l'objet à Jxls.