2015-03-13 97 views
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(); } 
       } 

} 
} 

任何指針什麼我可能是做錯了在這裏?

感謝 薩利姆

回答

0

擴展DefaultObjectWrapper類的問題得到解決之後。我不得不將它升級到更高版本的Freemarker.jar。

+0

我還不知道這裏發生了什麼事。錯誤消息就好像你試圖打印'TransformerInfoBuilder'本身,比如'$ {TransformerInfoBuilder}',而不是'id'裏面。 (當然,FM不知道如何渲染一個'TransformerInfoBuilder'對象,我也不知道。)你做了什麼定製? – ddekany 2015-03-13 19:40:43

+0

我不得不將DefaultObjectWrapper類擴展到我的TransformerInfoBuilder的子類,然後我能夠訪問對象內的所有字段。這個想法並不是要打印對象,而是它的內容。所以像$ {TransformerInfoBuilder.Id}和它的工作原理。 – user3081578 2015-03-13 20:55:47

+0

錯誤消息表明您嘗試打印「TransformerInfoBuilder」本身。此外,如果'TransformerInfoBuilder'是public並且'getId()'也是,並且您將一個'TransformerInfoBuilder'對象放入名爲'TransformerInfoBuilder'的數據模型中,那麼'$ {TransformerInfoBuilder.id}'(小寫'id' !)必須與默認對象包裝一起使用。這是使用FM的一種常見方式。 (我不明白你做了什麼,「將DefaultObjectWrapper類擴展到我的子類TransformerInfoBuilder」。) – ddekany 2015-03-14 09:41:18