2016-08-04 1 views
0

Во-первых, я прочитал this question, но это не решило мою проблему.Использование Freemarker для отображения таблицы произвольных объектов Java и их полей

Я пытаюсь создать таблицу, которая будет отображать произвольный список объектов Java. Когда я говорю «произвольный», я имею в виду, что количество объектов произвольное и что тип объектов произволен (все они будут экземплярами одного и того же класса). Я хочу, чтобы строки этой таблицы представляли объекты, а столбцы отображали значение переменной экземпляра каждого объекта (в основном, стиль таблицы). Первая строка, однако, будет просто списком имен переменных экземпляра.

Объекты, в которых я сейчас тестирую это, имеют все переменные, установленные как частные, но я предоставил соответствующие геттеры и сеттеры.

Вот фрагмент кода Java. Я вытаскиваю объекты из кеша Oracle Coherence и помещаю их в ArrayList. Затем я делаю массив строк имен переменных экземпляра .:

 /** 
    * Get objects in cache and add to ArrayList. 
    */ 

    for(Iterator iter = currentCache.entrySet().iterator();iter.hasNext();){ 
     Map.Entry entry = (Map.Entry)iter.next(); 
     String key = (String) entry.getKey(); 
     Pof tempPof = (Pof)entry.getValue(); 
     tableList.add(tempPof); 
     System.out.println("one loop"); 
    } 

    request.setAttribute("beans",tableList); 

    System.out.println("Size of tableList is: " + tableList.size()); 
    /** 
    * Build an array containing the variable names of cached objects. 
    */ 

    Field[] fields = Pof.class.getDeclaredFields(); 
    String[] variableNames = new String[fields.length]; 

    for(int j = 0; j < fields.length;j++){ 
     variableNames[j] = fields[j].getName(); 
     System.out.println(variableNames[j]); 
    } 

    request.setAttribute("colNames",variableNames); 


    /** 
    * numCols determines the number of columns displayed in the table. 
    */ 

    int numCols = fields.length; 
    String[] fieldStrings = new String[numCols]; 
    request.setAttribute("numCols",numCols); 
    Pof thing = (Pof) tableList.get(0); 

Вот отрывок из соответствующего файла .ftl:

<table border = "1px"> 
     <thead> 
      <tr> 
       <th colspan="${numCols}">${selectedCache}</th> 
      </tr> 
      <tr> 
       <#list colNames as colName> 
        <td>${colName}</td> 
       </#list> 
      </tr> 
     </thead> 
     <tbody> 
      <#list beans as bean> 
       <tr> 
        <#list colNames as colName> 
         <td>${bean[colName]}</td> 
        </#list> 
       </tr> 
      </#list> 
     </tbody> 

    </table> 

Это получает мне следующую ошибку:


freemarker.core.InvalidReferenceException: следующее оценивается как null или отсутствует: ==> bean [colName] [в шаблоне «front.ftl» по строке 46, столбец 35]

Совет. Это последний шаг, вызвавший эту ошибку, а не те, которые были перед ней.

Совет: Если отказавший выражение, как известно, по закону относятся к чему-то, что иногда нулевой или отсутствует, либо указать значение по умолчанию, как myOptionalVar myDefault, или использовать < #if myOptionalVar ??> когда-настоящее < #else> когда пропущенное. (Они охватывают только последний шаг выражения: для охвата всего выражения используйте круглую скобку: myOptionalVar.foo) myDefault, myOptionalVar.foo Трассировка стека FTL («~» означает связанное с вложением): - Сбой при: $ {боб [ColName]} [в шаблоне "front.ftl" в строке 46, колонка 33]

at freemarker.core.InvalidReferenceException.getInstance(InvalidReferenceException.java:134) 
at freemarker.core.EvalUtil.coerceModelToTextualCommon(EvalUtil.java:451) 
at freemarker.core.EvalUtil.coerceModelToStringOrMarkup(EvalUtil.java:374) 
at freemarker.core.DollarVariable.calculateInterpolatedStringOrMarkup(DollarVariable.java:96) 
at freemarker.core.DollarVariable.accept(DollarVariable.java:59) 
Truncated. see log file for complete stacktrace 

проблема, кажется, мой FTL синтаксис, то есть, это Безразлично «т нравится выражение $ {боба [ColName]}

Вопросы:.

1) Является ли синтаксис неправильным?

2) Это что-то, чего не может сделать Фримаркер?

3) Должен ли я попробовать другой подход? Например, должен ли я просто создать массив с каждым ведром, содержащим массив (или другую структуру данных) значений переменной экземпляра?

ответ

0

Он должен работать, при условии, что:

  • Pof общественного класс
  • Там есть общественный Pof.getFoo() метода для каждого colName"foo"
  • getFoo() возвращает Непро- null значения. Если он иногда возвращает null, вы должны указать, что отображать тогда, например: ${bean[colName]!'-'}
+0

Это получило мой стол! Но есть много нулевых полей. Когда я проверяю значения объектов, которые я отправляю на FreeMarker, они не равны нулю. Кажется, что не существует шаблона, который следует за типами переменных или значениями. Но я заметил, что переменные, возвращающие null, начинались с одной прописной буквы (например, «Big_Contracts»), а переменные экземпляра, которые были успешно доступны FreeMarker, начинались с двух заглавных букв (например, «LG_Contracts»). Does FreeMarker делает что-то в случае этих строк при использовании для извлечения данных из хэша? – murdoc1871

+0

FreeMarker не заботится о полях (ну, он может быть настроен для чтения общедоступных полей, но теперь это не в тему). Он заботится о свойствах JavaBeans. Таким образом, имена переменных выводятся из имен метода getter, в соответствии с правилами, указанными в спецификации JavaBeans. Для 'getBigContacts' имя свойства -' bigContacts'. Как ни странно, для 'getLGContacts()' имя свойства - 'LGContacts' ... Эти правила не определены FreeMarker, а спецификацией JavaBeans. – ddekany

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