Freemarker模板无法解析Java对象(Freemarker template not able to parse the Java object)
我有一个POJO(该类为每个字段设置了getter),我将其发送回完成模板配置的其他类中的变量。 不知何故,当
ftl
尝试填充视图时,我收到错误。我不知道如何将这种类型的对象呈现给模板:
org.test.config.TransformerInfoBuilder
。 以下是错误来自的代码:[line 13, column 5 in templates/ConfigMain.ftl] list TransformerInfoBuilders as TransformerInfoBuilder
Java错误堆栈跟踪:
freemarker.template.TemplateModelException: Don't know how to present an object of this type to a template: org.test.config.TransformerInfoBuilder at freemarker.template.SimpleObjectWrapper.handleUnknownType(SimpleObjectWrapper.java:139) at freemarker.template.SimpleObjectWrapper.wrap(SimpleObjectWrapper.java:116) at freemarker.template.WrappingTemplateModel.wrap(WrappingTemplateModel.java:131) at freemarker.template.SimpleSequence.get(SimpleSequence.java:197) at freemarker.template.IteratorBlock$Context.runLoop(IteratorBlock.java:163) at freemarker.template.Environment.visit(Environment.java:316) at freemarker.template.IteratorBlock.accept(IteratorBlock.java:94) at freemarker.template.Environment.visit(Environment.java:180) at freemarker.template.IfBlock.accept(IfBlock.java:81) at freemarker.template.Environment.visit(Environment.java:180) at freemarker.template.MixedContent.accept(MixedContent.java:91) at freemarker.template.Environment.visit(Environment.java:180) at freemarker.template.Environment.process(Environment.java:166) at freemarker.template.Template.process(Template.java:238) at org.mule.config.ConfigLoader.main(ConfigLoader.java:116)
ftl如下。
<#if TransformerInfoBuilders?has_content> <#list TransformerInfoBuilders as TransformerInfoBuilder> <flow name="${TransformerInfoBuilder.id}"> </flow> </#list> <#else> no content </#if>
用于创建对象的Java类。
public class TransformerInfoBuilder { String id=""; String name=""; String returnClass=""; String ignoreBadInput=""; String encoding=""; String mimeType=""; String templateName=""; public TransformerInfoBuilder(String id, String name,String returnClass, String encoding, String ignoreBadInput) { this.id=id; this.name=name; this.returnClass=returnClass; this.encoding=encoding; this.ignoreBadInput=ignoreBadInput; } public void setid(String id) { this.id=id; } public void setname(String name) { this.name=name; } public String getname() { return this.name; } public String getid() { return this.id; } public String getreturnClass() { return this.returnClass; } public String getignoreBadInput() { return this.ignoreBadInput; } public String getencoding() { return this.encoding; } }
调用配置程序的Java类:
public class ConfigLoader { public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, SQLException, IOException { Configuration cfg = new Configuration(); Template template = cfg.getTemplate("/templates/ConfigMain.ftl"); Connection dbconn=null; Statement stmt=null; ResultSet rs= null; String id=""; HashMap<String,Map<String,String>> tinfo= new HashMap<String,Map<String,String>> (); List<String> flowList = new ArrayList<String>(); List<TransformerInfoBuilder> TransformerInfoBuilders = new ArrayList<TransformerInfoBuilder>(); //Map<String,Object> flistfinal = new HashMap<String,Object>(); Map<String, Object> data = new HashMap<String, Object>(); List<Map<String,ArrayList<String>>> mapsfinal = new ArrayList<Map<String,ArrayList<String>>>(); try { // Load the template String configId =args[0]; System.out.println("+++++++++++++++++++++++configID is " + configId + " +++++++++++++++++++++++"); dbconn=DBConnection.connection(); System.out.println("\n\n++++++++++++++++++ Obtained DB connection ++++++++++++++++"); stmt = dbconn.createStatement(); System.out.println("\n\n++++++++++++++++++ Querying for Config Application Name ++++++++"); rs = stmt.executeQuery("SELECT * FROM FlowInfo where ConfigFileId =" + configId); while (rs.next()) { id = rs.getString("FlowID"); flowList.add(id); } TransformerInfoBuilders=Transformer.TransformerInfo(flowList); data.put("TransformerInfoBuilders",TransformerInfoBuilders); data.put("message","#[payload]"); Writer writer = new FileWriter("output/MainConfig.xml"); template.process(data, writer); writer.flush(); writer.close(); //out.flush(); } catch (IOException e) { e.printStackTrace(); } catch (TemplateException et) { et.printStackTrace(); }finally { try { if (rs != null) rs.close(); } catch (SQLException e) { e.printStackTrace(); } try { if (stmt != null) stmt.close(); } catch (SQLException e) { e.printStackTrace(); } try { if (dbconn != null) dbconn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
关于我在这里做错了什么的指示?
谢谢萨利姆
I have a POJO (the class has getters set for each field) which i am sending back to a variable in a different class where the template configuration is done. Somehow i am getting an error when the
ftl
tries to populate the view.I don't know how to present an object of this type to a template:
org.test.config.TransformerInfoBuilder
. Here is the code where the error comes from:[line 13, column 5 in templates/ConfigMain.ftl] list TransformerInfoBuilders as TransformerInfoBuilder
Java error stacktrace:
freemarker.template.TemplateModelException: Don't know how to present an object of this type to a template: org.test.config.TransformerInfoBuilder at freemarker.template.SimpleObjectWrapper.handleUnknownType(SimpleObjectWrapper.java:139) at freemarker.template.SimpleObjectWrapper.wrap(SimpleObjectWrapper.java:116) at freemarker.template.WrappingTemplateModel.wrap(WrappingTemplateModel.java:131) at freemarker.template.SimpleSequence.get(SimpleSequence.java:197) at freemarker.template.IteratorBlock$Context.runLoop(IteratorBlock.java:163) at freemarker.template.Environment.visit(Environment.java:316) at freemarker.template.IteratorBlock.accept(IteratorBlock.java:94) at freemarker.template.Environment.visit(Environment.java:180) at freemarker.template.IfBlock.accept(IfBlock.java:81) at freemarker.template.Environment.visit(Environment.java:180) at freemarker.template.MixedContent.accept(MixedContent.java:91) at freemarker.template.Environment.visit(Environment.java:180) at freemarker.template.Environment.process(Environment.java:166) at freemarker.template.Template.process(Template.java:238) at org.mule.config.ConfigLoader.main(ConfigLoader.java:116)
The ftl is as below.
<#if TransformerInfoBuilders?has_content> <#list TransformerInfoBuilders as TransformerInfoBuilder> <flow name="${TransformerInfoBuilder.id}"> </flow> </#list> <#else> no content </#if>
Java class for creating the object.
public class TransformerInfoBuilder { String id=""; String name=""; String returnClass=""; String ignoreBadInput=""; String encoding=""; String mimeType=""; String templateName=""; public TransformerInfoBuilder(String id, String name,String returnClass, String encoding, String ignoreBadInput) { this.id=id; this.name=name; this.returnClass=returnClass; this.encoding=encoding; this.ignoreBadInput=ignoreBadInput; } public void setid(String id) { this.id=id; } public void setname(String name) { this.name=name; } public String getname() { return this.name; } public String getid() { return this.id; } public String getreturnClass() { return this.returnClass; } public String getignoreBadInput() { return this.ignoreBadInput; } public String getencoding() { return this.encoding; } }
Java class where the call to configurator is made:
public class ConfigLoader { public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, SQLException, IOException { Configuration cfg = new Configuration(); Template template = cfg.getTemplate("/templates/ConfigMain.ftl"); Connection dbconn=null; Statement stmt=null; ResultSet rs= null; String id=""; HashMap<String,Map<String,String>> tinfo= new HashMap<String,Map<String,String>> (); List<String> flowList = new ArrayList<String>(); List<TransformerInfoBuilder> TransformerInfoBuilders = new ArrayList<TransformerInfoBuilder>(); //Map<String,Object> flistfinal = new HashMap<String,Object>(); Map<String, Object> data = new HashMap<String, Object>(); List<Map<String,ArrayList<String>>> mapsfinal = new ArrayList<Map<String,ArrayList<String>>>(); try { // Load the template String configId =args[0]; System.out.println("+++++++++++++++++++++++configID is " + configId + " +++++++++++++++++++++++"); dbconn=DBConnection.connection(); System.out.println("\n\n++++++++++++++++++ Obtained DB connection ++++++++++++++++"); stmt = dbconn.createStatement(); System.out.println("\n\n++++++++++++++++++ Querying for Config Application Name ++++++++"); rs = stmt.executeQuery("SELECT * FROM FlowInfo where ConfigFileId =" + configId); while (rs.next()) { id = rs.getString("FlowID"); flowList.add(id); } TransformerInfoBuilders=Transformer.TransformerInfo(flowList); data.put("TransformerInfoBuilders",TransformerInfoBuilders); data.put("message","#[payload]"); Writer writer = new FileWriter("output/MainConfig.xml"); template.process(data, writer); writer.flush(); writer.close(); //out.flush(); } catch (IOException e) { e.printStackTrace(); } catch (TemplateException et) { et.printStackTrace(); }finally { try { if (rs != null) rs.close(); } catch (SQLException e) { e.printStackTrace(); } try { if (stmt != null) stmt.close(); } catch (SQLException e) { e.printStackTrace(); } try { if (dbconn != null) dbconn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
Any pointers on what i might be doing wrong over here??
Thanks Salim
原文:https://stackoverflow.com/questions/29026481
最满意答案
你可以用另一个函数创建一个函数:
function sort_by(attr) { return function(o1, o2) { var a = o1[attr]; var b = o2[attr]; return ((a < b) ? -1 : ((a > b) ? 1 : 0)); }; }
然后把它叫做
.sort(sort_by('id'))
。You can create a function with another function:
function sort_by(attr) { return function(o1, o2) { var a = o1[attr]; var b = o2[attr]; return ((a < b) ? -1 : ((a > b) ? 1 : 0)); }; }
And then call it like
.sort(sort_by('id'))
.
相关问答
更多-
这是因为您使用默认排序算法对数字进行排序,该算法将它们转换为字符串并按字典顺序排序。 而是通过其返回值传递定义排序顺序的函数。 var arr = [23,43,54,2,3,12]; console.log(arr.sort((a, b) => a - b)); 返回正数会移动到列表的末尾。 It's because you're sorting the numbers with the default sorting algorithm, which converts them to a str ...
-
在main方法中,您已声明了一个500长度的数组,但只初始化了3个元素,因此其中497个为null 。 这会导致比较器出现问题,因为比较器会被许多元素对调用,包括一些null元素。 尝试修改main方法,只声明并初始化3长度数组,然后再次编译并运行它。 也许你的比较器确实存在问题,但至少让我们删除明显的问题并尝试对所有元素都为非null进行排序。 In your main method, you've declared a 500-length array but have only initialized ...
-
您需要创建一个新数组作为第一个的克隆,目前看起来您正在保存对它的引用。 尝试这个: var clone = myArray.slice(0); You need to create a new array as a clone of the first, currently it looks like you are saving a reference to it. try this: var clone = myArray.slice(0);
-
你可以用另一个函数创建一个函数: function sort_by(attr) { return function(o1, o2) { var a = o1[attr]; var b = o2[attr]; return ((a < b) ? -1 : ((a > b) ? 1 : 0)); }; } 然后把它叫做.sort(sort_by('id')) 。 You can create a function with another fu ...
-
sort函数执行以下操作: return value2 - value1; 让我们更详细一点,以便我们可以看到发生了什么: var values = [213, 16, 2058, 54, 10, 1965, 57, 9]; values.sort(function(value1,value2){ console.log(value2 + ' - ' + value1 + ' = ' + (value2 - value1) + ' | (' + (value2 - value1 > 0 ? 'p ...
-
Javascript插件,用于在HTML表格上执行排序功能(Javascript plugin to do sorting functionality over a HTML table)[2023-07-26]
你试过数据表吗? http://datatables.net/release-datatables/examples/basic_init/multi_col_sort.html 用法很简单 http://datatables.net/usage/ Have you tried datatables? http://datatables.net/release-datatables/examples/basic_init/multi_col_sort.html Usage is simple http:// ... -
如果使用datatype: "json"则服务器从选项sortname: "BankName"获取参数sortname: "BankName"和sortorder: "asc"作为sidx (排序索引)和sord (排序方向)。 因此,服务器 至少负责返回数据的初始排序。 我建议你添加loadonce: true选项,这意味着你一次加载来自服务器的所有数据 (不只是10行数据,请参阅rowNum: 10选项),而不实现服务器端数据分页。 因此服务器只需要对数据进行初始排序。 jqGrid将保存内部参数dat ...
-
只需捕获日期和月份部分,交换它们并执行Date.parse和new Date ,就像这样 function getFormattedDate(dateString) { var result = dateString.replace(/(\d+)\/(\d+)(.*)/, function (m, g1, g2, g3) { return g2 + "/" + g1 + g3; }); return new Date(Date.parse(result)); } ...
-
要执行sort函数,你必须提供max,min equal(+1(实际上> 0),-1(实际上是0),0(等于)),更快的方法是减去结果: arr.sort(function(a, b){ // ASC -> a.length - b.length // DESC -> b.length - a.length return a.length - b.length ; }); To do the sort function, you have to provide the max, min eq ...
-
我尝试做的只是改变initIndex来改为使用我的奴隶索引,这确实有效......但我认为如果我需要每次用户想要重新初始化索引时这都是缓慢而低效的按日期排序。 是不是有一个参数,而不是我可以插入查询按日期排序? 您应该将所有要进行排序的索引存储在this对象的不同属性中: this.indices = { mostRelevant: this.client.initIndex('master_index'), desc: this.client.initIndex('slave_desc') }; ...