Во-первых, я прочитал 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) Должен ли я попробовать другой подход? Например, должен ли я просто создать массив с каждым ведром, содержащим массив (или другую структуру данных) значений переменной экземпляра?
Это получило мой стол! Но есть много нулевых полей. Когда я проверяю значения объектов, которые я отправляю на FreeMarker, они не равны нулю. Кажется, что не существует шаблона, который следует за типами переменных или значениями. Но я заметил, что переменные, возвращающие null, начинались с одной прописной буквы (например, «Big_Contracts»), а переменные экземпляра, которые были успешно доступны FreeMarker, начинались с двух заглавных букв (например, «LG_Contracts»). Does FreeMarker делает что-то в случае этих строк при использовании для извлечения данных из хэша? – murdoc1871
FreeMarker не заботится о полях (ну, он может быть настроен для чтения общедоступных полей, но теперь это не в тему). Он заботится о свойствах JavaBeans. Таким образом, имена переменных выводятся из имен метода getter, в соответствии с правилами, указанными в спецификации JavaBeans. Для 'getBigContacts' имя свойства -' bigContacts'. Как ни странно, для 'getLGContacts()' имя свойства - 'LGContacts' ... Эти правила не определены FreeMarker, а спецификацией JavaBeans. – ddekany