FreeMarker使用Template生成可变参数的json(一),及访问Template出现not found
上篇文章使用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"
}
}
}
}
}
}
}
}
}
更多推荐
所有评论(0)