上篇文章使用yaml进行json的变量赋值,感觉还是挺麻烦的,于是用Freemarker模板进行data+template=out(json),方便多了。

但是中间出了点小岔子,在获取模板文件路径的时候,发现FreeMarker源码里加载的loaderClass就是从调用端传过来的××test.class,如果测试类放在src/main/test/java下,FreeMarkerUtils类和××.ftl文件放在src/main/java下,则会出现模板文件找不到的情况,详情见下图:
这里写图片描述

*eventflow.ftl文件和FreeMarkerUtils.java放在
src/main/java目录下
FreeMarkerTest.java文件
放在src/main/test/java下
从FreeMarker源码里看 ClassTemplaterLoader使用的Class是直接从前面传过来的class,即我的测试类FreeMarkerTest.class,这里就出现一个类似”跨域“的问题,只能访问src/main/test/包下的路径,而不能访问src/mian/java/下的资源,所以FM源码中的getUrl方法获取的路径为null,导致Template文件找不到。
解决办法有3种:
1、这是将测试类放在src/main/test/下;如果将测试类放在src/main/java/下则不会出现找不到文件。
2、将模板文件.ftl放在src/main/test/*下;
3、将测试类中传过来的FreeMarkerTest.class换成src/main/java/下的某个公共类的class,有见过使用Junit的Test.class的情况;

突然发现,出现Template出现not found,终极原因不是上面所说的类存放的位置不对,是由于编译后的class里面(工程/target/class/*)里面相关目录下并没有将××.ftl文件放进去,需要清理工程重新构建下才会出现(也有可能还是没有,刷新下工程说不定就有了),如果再没有可直接将文件放到目录下。

pom.xml依赖

<dependency>
    <groupId>freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.9</version>
</dependency>

main函数:

package com.mdl.FreeMarker;

import java.util.HashMap;
import java.util.Map;

public class FMTest {
    public static void main(String[] args) {
        FreeMarkerUtils utl = new FreeMarkerUtils("/files/ftl","eventflow");

        Map<String, Object> context = new HashMap<String, Object>();
        context.put("size", 0);
        context.put("gte_val", "111111497283200000");
        context.put("lte_val", "1497928996980");
        context.put("min_val", "1497283200000");
        context.put("max_val", "1497928996980");
        context.put("interval", "21526566ms");

        String json = utl.setValue(context);

        System.out.println(json);

    }
}

工具类:

package com.mdl.FreeMarker;

import java.io.IOException;
import java.io.StringWriter;
import java.util.Map;

import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

import freemarker.cache.ClassTemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;

public class FreeMarkerUtils {

    private String ftl_n;

    private Configuration configuration;

    public FreeMarkerUtils(String path,String ftl_name) {
        this.ftl_n = ftl_name;
        configuration = new Configuration();
        configuration.setObjectWrapper(new DefaultObjectWrapper());
        configuration.setTemplateLoader(new ClassTemplateLoader(getClass(), path));
    }

    public String setValue(Map<String, Object> context) {
        JsonObject returnData = null;
        try {
            Template template = configuration.getTemplate(ftl_n + ".ftl");
            StringWriter writer = new StringWriter();
            template.process(context, writer);
            String result = writer.toString();
            returnData = new JsonParser().parse(result).getAsJsonObject();//先将模板文件转为json对象,再转为json字符串
        } catch (IOException e) {
            e.printStackTrace();
        } catch (TemplateException e) {
            e.printStackTrace();
        }
        return returnData.toString();
    }

}

eventflow.ftl模板文件

{
    "size": ${size},
    "query": {
        "constant_score": {
            "filter": {
                "range": {
                    "last_updated": {
                        "gte": ${gte_val},
                        "lte": ${lte_val}
                    }
                }
            }
        }
    },
    "aggs": {
        "by_time": {
            "date_histogram": {
                "field": "last_updated",
                "interval": "${interval}",
                "extended_bounds": {
                    "min": "${min_val}",
                    "max": "${max_val}"
                }
            },
            "aggs": {
                "event_status_group": {
                    "filters": {
                        "filters": {
                            "info": {
                                "match_phrase": {
                                    "alert_status": "info"
                                }
                            },
                            "warning": {
                                "match_phrase": {
                                    "alert_status": "warning"
                                }
                            },
                            "error": {
                                "match_phrase": {
                                    "alert_status": "error"
                                }
                            },
                            "success": {
                                "match_phrase": {
                                    "alert_status": "success"
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
GitHub 加速计划 / js / json
41.72 K
6.61 K
下载
适用于现代 C++ 的 JSON。
最近提交(Master分支:1 个月前 )
960b763e 4 个月前
8c391e04 6 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐