2015-03-13 3 views
0

У меня есть POJO (у класса есть геттеры, установленные для каждого поля), которые я отправляю обратно в переменную в другом классе, где выполнена настройка шаблона. Как-то я получаю сообщение об ошибке, когда ftl пытается заполнить представление.Шаблон Freemarker не может проанализировать объект Java

Я не знаю, как представить объект этого типа в шаблон: org.test.config.TransformerInfoBuilder. Вот код, где ошибка происходит от:

[line 13, column 5 in templates/ConfigMain.ftl] 
list TransformerInfoBuilders as TransformerInfoBuilder 

Java ошибки 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) 

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

+0

Мне пришлось расширить класс DefaultObjectWrapper на мой подкласс, который является TransformerInfoBuilder, а затем я смог получить доступ ко всем полям, находящимся внутри объекта. Идея заключалась не в том, чтобы однозначно печатать объект, а в его содержимом .. Так что-то вроде $ {TransformerInfoBuilder.Id}, и оно сработало .. – user3081578

+0

Сообщение об ошибке предполагает, что вы пытались распечатать '' TransformerInfoBuilder''. Кроме того, если 'TransformerInfoBuilder' является общедоступным и' getId() 'тоже, и вы помещаете объект TransformerInfoBuilder в модель данных с именем' TransformerInfoBuilder', то '$ {TransformerInfoBuilder.id}' (с нижним регистром 'id' !) должен работать с оберткой объекта по умолчанию. Это полностью распространенный способ использования FM. (Я не понимаю, что вы сделали), добавьте класс DefaultObjectWrapper в мой подкласс, который является TransformerInfoBuilder.) – ddekany

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