0

Play with Excel モジュール 1.2.3 を使用しています。コントローラーで、モデルで定義されたメソッドを呼び出すことで、Student のリストを取得します - Student:

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 レポートのセルは空白です。

誰でもこれを説明できますか?

NB 学生はアドレスを怠惰に参照します

4

1 に答える 1

0

Jxls は Apache Jexl を使用して、 のようなプロパティ式を処理しますstu.address.name。Jexl はリフレクションを使用してオブジェクトのプロパティ値を計算します。しかし、実際のオブジェクトではなくプロキシ オブジェクトを操作するため、リフレクションと遅延読み込みはうまくいきません。

実行するとSystem.out.println(student.address.name)、実際のオブジェクトがインスタンス化され、反射が正常に機能します。

この問題の考えられる解決策は、この回答Converting Hibernate proxy to real objectで説明されています。または、オブジェクトを Jxls に渡す必要があるときはいつでも熱心なフェッチを行う必要があります。

于 2015-07-16T17:00:52.353 に答える