fix Velocity bug

This commit is contained in:
Looly 2020-08-28 11:32:52 +08:00
parent 84494f4ef2
commit f49c3cba6e
6 changed files with 60 additions and 14 deletions

View File

@ -24,6 +24,7 @@
* 【poi 】 修复ExcelBase.isXlsx方法判断问题issue#I1S502@Gitee
* 【poi 】 修复Excel03SaxReader日期方法判断问题pr#1026@Github
* 【core 】 修复StrUtil.indexOf空指针问题issue#1038@Github
* 【extra 】 修复VelocityEngine编码问题和路径前缀问题issue#I1T0IG@Gitee
-------------------------------------------------------------------------------------------------------------

View File

@ -333,7 +333,7 @@ public class BeanDesc implements Serializable {
// ------------------------------------------------------------------------------------------------------ Private method end
/**
* 属性描述
* 属性描述包括了字段gettersetter和相应的方法执行
*
* @author looly
*/

View File

@ -1,11 +1,10 @@
package cn.hutool.extra.template.engine.velocity;
import org.apache.velocity.app.Velocity;
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.template.Template;
import cn.hutool.extra.template.TemplateConfig;
import cn.hutool.extra.template.TemplateEngine;
import org.apache.velocity.app.Velocity;
/**
* Velocity模板引擎
@ -16,6 +15,7 @@ import cn.hutool.extra.template.TemplateEngine;
public class VelocityEngine implements TemplateEngine {
private org.apache.velocity.app.VelocityEngine engine;
private TemplateConfig config;
// --------------------------------------------------------------------------------- Constructor start
/**
@ -47,6 +47,7 @@ public class VelocityEngine implements TemplateEngine {
if(null == config){
config = TemplateConfig.DEFAULT;
}
this.config = config;
init(createEngine(config));
return this;
}
@ -74,7 +75,25 @@ public class VelocityEngine implements TemplateEngine {
if(null == this.engine){
init(TemplateConfig.DEFAULT);
}
return VelocityTemplate.wrap(engine.getTemplate(resource));
// 目录前缀
String root;
// 自定义编码
String charsetStr = null;
if(null != this.config){
root = this.config.getPath();
charsetStr = this.config.getCharsetStr();
// 修正template目录在classpath或者web_root模式下按照配置添加默认前缀
// 如果用户已经自行添加了前缀则忽略之
final TemplateConfig.ResourceMode resourceMode = this.config.getResourceMode();
if(TemplateConfig.ResourceMode.CLASSPATH == resourceMode
|| TemplateConfig.ResourceMode.WEB_ROOT == resourceMode){
resource = StrUtil.addPrefixIfNot(resource, StrUtil.addSuffixIfNot(root, "/"));
}
}
return VelocityTemplate.wrap(engine.getTemplate(resource, charsetStr));
}
/**
@ -98,7 +117,9 @@ public class VelocityEngine implements TemplateEngine {
// loader
switch (config.getResourceMode()) {
case CLASSPATH:
ve.setProperty("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
// 新版Velocity弃用
// ve.setProperty("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
ve.setProperty("resource.loader.file.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
break;
case FILE:
// path

View File

@ -1,13 +1,5 @@
package cn.hutool.extra.template;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;
import cn.hutool.core.lang.Dict;
import cn.hutool.extra.template.TemplateConfig.ResourceMode;
import cn.hutool.extra.template.engine.beetl.BeetlEngine;
@ -16,6 +8,13 @@ import cn.hutool.extra.template.engine.freemarker.FreemarkerEngine;
import cn.hutool.extra.template.engine.rythm.RythmEngine;
import cn.hutool.extra.template.engine.thymeleaf.ThymeleafEngine;
import cn.hutool.extra.template.engine.velocity.VelocityEngine;
import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
/**
* 模板引擎单元测试
@ -99,10 +98,13 @@ public class TemplateUtilTest {
//ClassPath模板
engine = TemplateUtil.createEngine(
new TemplateConfig("templates", ResourceMode.CLASSPATH).setCustomEngine(VelocityEngine.class));
template = engine.getTemplate("velocity_test.vtl");
result = template.render(Dict.create().set("name", "hutool"));
Assert.assertEquals("你好,hutool", result);
template = engine.getTemplate("templates/velocity_test.vtl");
result = template.render(Dict.create().set("name", "hutool"));
Assert.assertEquals("你好,hutool", result);
}
@Test

View File

@ -0,0 +1,21 @@
package cn.hutool.extra.template;
import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.extra.template.engine.velocity.VelocityEngine;
import org.junit.Assert;
import org.junit.Test;
public class VelocityTest {
@Test
public void charsetTest(){
final TemplateConfig config = new TemplateConfig("templates", TemplateConfig.ResourceMode.CLASSPATH);
config.setCustomEngine(VelocityEngine.class);
config.setCharset(CharsetUtil.CHARSET_GBK);
final TemplateEngine engine = TemplateUtil.createEngine(config);
Template template = engine.getTemplate("velocity_test_gbk.vtl");
String result = template.render(Dict.create().set("name", "hutool"));
Assert.assertEquals("你好,hutool", result);
}
}

View File

@ -0,0 +1 @@
ÄăşĂ,$name