diff --git a/CHANGELOG.md b/CHANGELOG.md index c51a639b9..0d1534c5f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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) ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/BeanDesc.java b/hutool-core/src/main/java/cn/hutool/core/bean/BeanDesc.java index 493b19309..62fc4d268 100644 --- a/hutool-core/src/main/java/cn/hutool/core/bean/BeanDesc.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/BeanDesc.java @@ -333,7 +333,7 @@ public class BeanDesc implements Serializable { // ------------------------------------------------------------------------------------------------------ Private method end /** - * 属性描述 + * 属性描述,包括了字段、getter、setter和相应的方法执行 * * @author looly */ diff --git a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/velocity/VelocityEngine.java b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/velocity/VelocityEngine.java index f4415d789..73a97efb1 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/velocity/VelocityEngine.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/velocity/VelocityEngine.java @@ -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 diff --git a/hutool-extra/src/test/java/cn/hutool/extra/template/TemplateUtilTest.java b/hutool-extra/src/test/java/cn/hutool/extra/template/TemplateUtilTest.java index b299f5b9b..77a273fe1 100644 --- a/hutool-extra/src/test/java/cn/hutool/extra/template/TemplateUtilTest.java +++ b/hutool-extra/src/test/java/cn/hutool/extra/template/TemplateUtilTest.java @@ -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 diff --git a/hutool-extra/src/test/java/cn/hutool/extra/template/VelocityTest.java b/hutool-extra/src/test/java/cn/hutool/extra/template/VelocityTest.java new file mode 100644 index 000000000..a042c2775 --- /dev/null +++ b/hutool-extra/src/test/java/cn/hutool/extra/template/VelocityTest.java @@ -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); + } +} diff --git a/hutool-extra/src/test/resources/templates/velocity_test_gbk.vtl b/hutool-extra/src/test/resources/templates/velocity_test_gbk.vtl new file mode 100644 index 000000000..491be1b4f --- /dev/null +++ b/hutool-extra/src/test/resources/templates/velocity_test_gbk.vtl @@ -0,0 +1 @@ +,$name \ No newline at end of file