0
我有一個POJO(該類爲每個字段設置了getter),我將其發送回模板配置完成的其他類中的變量。不知何故,當ftl
試圖填充視圖時,我收到錯誤。Freemarker模板無法解析Java對象
我不知道如何將這種類型的對象呈現給模板: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(); }
}
}
}
任何指針什麼我可能是做錯了在這裏?
感謝 薩利姆
我還不知道這裏發生了什麼事。錯誤消息就好像你試圖打印'TransformerInfoBuilder'本身,比如'$ {TransformerInfoBuilder}',而不是'id'裏面。 (當然,FM不知道如何渲染一個'TransformerInfoBuilder'對象,我也不知道。)你做了什麼定製? – ddekany 2015-03-13 19:40:43
我不得不將DefaultObjectWrapper類擴展到我的TransformerInfoBuilder的子類,然後我能夠訪問對象內的所有字段。這個想法並不是要打印對象,而是它的內容。所以像$ {TransformerInfoBuilder.Id}和它的工作原理。 – user3081578 2015-03-13 20:55:47
錯誤消息表明您嘗試打印「TransformerInfoBuilder」本身。此外,如果'TransformerInfoBuilder'是public並且'getId()'也是,並且您將一個'TransformerInfoBuilder'對象放入名爲'TransformerInfoBuilder'的數據模型中,那麼'$ {TransformerInfoBuilder.id}'(小寫'id' !)必須與默認對象包裝一起使用。這是使用FM的一種常見方式。 (我不明白你做了什麼,「將DefaultObjectWrapper類擴展到我的子類TransformerInfoBuilder」。) – ddekany 2015-03-14 09:41:18