Browse Source

fix Velocity bug

Looly 5 years ago
parent
commit
f49c3cba6e

+ 1 - 0
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)
 
 -------------------------------------------------------------------------------------------------------------
 

+ 1 - 1
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
 	 */

+ 25 - 4
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

+ 11 - 9
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

+ 21 - 0
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);
+	}
+}

+ 1 - 0
hutool-extra/src/test/resources/templates/velocity_test_gbk.vtl

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