Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Freemarker模板无法解析Java对象_Java_Templates_Freemarker - Fatal编程技术网

Freemarker模板无法解析Java对象

Freemarker模板无法解析Java对象,java,templates,freemarker,Java,Templates,Freemarker,我有一个POJO,该类为每个字段设置了getter,我将其发送回另一个类中的变量,在该类中完成模板配置。不知何故,当ftl试图填充视图时,我遇到了一个错误 我不知道如何将这种类型的对象呈现给模板:org.test.config.TransformerInfoBuilder。以下是错误产生的代码: [line 13, column 5 in templates/ConfigMain.ftl] list TransformerInfoBuilders as TransformerInfoBuilde

我有一个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>
调用configurator的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(); }
                }

}
}
有没有关于我在这里做错了什么的建议

谢谢
Salim

扩展DefaultObjectWrapper类后,问题得到了解决。我不得不将它升级到更高版本的Freemarker.jar

我还不明白这里发生了什么。错误消息就好像您试图打印TransformerInfoBuilder本身,如${TransformerInfoBuilder},而不是其中的id。当然,FM不知道如何渲染TransformerInfoBuilder对象。我也不知道。你做了什么定制?我必须将DefaultObjectWrapper类扩展到我的子类TransformerInfo Builder,然后我才能访问对象中的所有字段。我们的想法并不是要打印对象,而是打印对象的内容。。所以类似${TransformerInfoBuilder.Id}的东西就成功了。错误消息表明您试图打印TransformerInfoBuilder本身。另外,如果TransformerInfo Builder是公共的,而getId也是公共的,并且您将TransformerInfo Builder对象放入名为TransformerInfo Builder的数据模型中,然后使用小写id${TransformerInfo Builder.id}!必须使用默认的对象包装器。这是使用FM的一种非常常见的方式。我不明白您做了什么,将DefaultObjectWrapper类扩展到我的子类TransformerInfo Builder。
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(); }
                }

}
}