diff --git a/CHANGELOG.md b/CHANGELOG.md
index 68cdf872f..ebd9c027a 100755
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -10,6 +10,7 @@
* 【jwt 】 优化JWT自动识别header中的算法,并可自定义header中key的顺序(issue#I5QRUO@Gitee)
* 【core 】 IdcardUtil增加convert18To15方法(issue#I5QYCP@Gitee)
* 【core 】 新增AnsiColors(改自Spring Boot)、AnsiColorWrapper,优化QrCodeUtil(pr#778@Gitee)
+* 【core 】 TemplateUtil的实现类增加getRawEngine方法(issues#2530@Github)
### 🐞Bug修复
* 【core 】 修复ObjectUtil.defaultIfXXX中NPE问题(pr#2603@Github)
diff --git a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/beetl/BeetlEngine.java b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/beetl/BeetlEngine.java
index cbb34fed8..d4848f7b8 100644
--- a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/beetl/BeetlEngine.java
+++ b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/beetl/BeetlEngine.java
@@ -17,7 +17,7 @@ import java.io.IOException;
/**
* Beetl模板引擎封装
- *
+ *
* @author looly
*/
public class BeetlEngine implements TemplateEngine {
@@ -32,7 +32,7 @@ public class BeetlEngine implements TemplateEngine {
/**
* 构造
- *
+ *
* @param config 模板配置
*/
public BeetlEngine(TemplateConfig config) {
@@ -41,7 +41,7 @@ public class BeetlEngine implements TemplateEngine {
/**
* 构造
- *
+ *
* @param engine {@link GroupTemplate}
*/
public BeetlEngine(GroupTemplate engine) {
@@ -72,9 +72,19 @@ public class BeetlEngine implements TemplateEngine {
return BeetlTemplate.wrap(engine.getTemplate(resource));
}
+ /**
+ * 获取原始引擎的钩子方法,用于自定义特殊属性,如插件等
+ *
+ * @return {@link GroupTemplate}
+ * @since 5.8.7
+ */
+ public GroupTemplate getRawEngine() {
+ return this.engine;
+ }
+
/**
* 创建引擎
- *
+ *
* @param config 模板配置
* @return {@link GroupTemplate}
*/
@@ -103,7 +113,7 @@ public class BeetlEngine implements TemplateEngine {
/**
* 创建自定义的模板组 {@link GroupTemplate},配置文件使用全局默认
* 此时自定义的配置文件可在ClassPath中放入beetl.properties配置
- *
+ *
* @param loader {@link ResourceLoader},资源加载器
* @return {@link GroupTemplate}
* @since 3.2.0
@@ -118,7 +128,7 @@ public class BeetlEngine implements TemplateEngine {
/**
* 创建自定义的 {@link GroupTemplate}
- *
+ *
* @param loader {@link ResourceLoader},资源加载器
* @param conf {@link Configuration} 配置文件
* @return {@link GroupTemplate}
diff --git a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/enjoy/EnjoyEngine.java b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/enjoy/EnjoyEngine.java
index 59c1c815e..1d4164e1f 100755
--- a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/enjoy/EnjoyEngine.java
+++ b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/enjoy/EnjoyEngine.java
@@ -77,6 +77,16 @@ public class EnjoyEngine implements TemplateEngine {
return EnjoyTemplate.wrap(this.engine.getTemplate(resource));
}
+ /**
+ * 获取原始引擎的钩子方法,用于自定义特殊属性,如插件等
+ *
+ * @return {@link com.jfinal.template.Engine}
+ * @since 5.8.7
+ */
+ public com.jfinal.template.Engine getRawEngine() {
+ return this.engine;
+ }
+
/**
* 创建引擎
*
diff --git a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/freemarker/FreemarkerEngine.java b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/freemarker/FreemarkerEngine.java
index 8f207e957..349d31457 100644
--- a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/freemarker/FreemarkerEngine.java
+++ b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/freemarker/FreemarkerEngine.java
@@ -15,7 +15,7 @@ import java.io.IOException;
/**
* FreeMarker模板引擎封装
- * 见:https://freemarker.apache.org/
+ * 见:https://freemarker.apache.org/
*
* @author looly
*/
@@ -82,6 +82,16 @@ public class FreemarkerEngine implements TemplateEngine {
}
}
+ /**
+ * 获取原始引擎的钩子方法,用于自定义特殊属性,如插件等
+ *
+ * @return {@link Configuration}
+ * @since 5.8.7
+ */
+ public Configuration getConfiguration() {
+ return this.cfg;
+ }
+
/**
* 创建配置项
*
diff --git a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/jetbrick/JetbrickEngine.java b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/jetbrick/JetbrickEngine.java
index f6b3f24ed..c347c4107 100755
--- a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/jetbrick/JetbrickEngine.java
+++ b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/jetbrick/JetbrickEngine.java
@@ -66,6 +66,16 @@ public class JetbrickEngine implements TemplateEngine {
return JetbrickTemplate.wrap(engine.getTemplate(resource));
}
+ /**
+ * 获取原始引擎的钩子方法,用于自定义特殊属性,如插件等
+ *
+ * @return {@link JetEngine}
+ * @since 5.8.7
+ */
+ public JetEngine getRawEngine() {
+ return this.engine;
+ }
+
/**
* 创建引擎
*
diff --git a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/rythm/RythmEngine.java b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/rythm/RythmEngine.java
index efd5ed25c..c08cb74ed 100644
--- a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/rythm/RythmEngine.java
+++ b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/rythm/RythmEngine.java
@@ -1,15 +1,15 @@
package cn.hutool.extra.template.engine.rythm;
-import java.util.Properties;
-
import cn.hutool.extra.template.Template;
import cn.hutool.extra.template.TemplateConfig;
import cn.hutool.extra.template.TemplateEngine;
+import java.util.Properties;
+
/**
* Rythm模板引擎
* 文档:http://rythmengine.org/doc/index
- *
+ *
* @author looly
*
*/
@@ -25,7 +25,7 @@ public class RythmEngine implements TemplateEngine {
/**
* 构造
- *
+ *
* @param config 模板配置
*/
public RythmEngine(TemplateConfig config) {
@@ -34,7 +34,7 @@ public class RythmEngine implements TemplateEngine {
/**
* 构造
- *
+ *
* @param engine {@link org.rythmengine.RythmEngine}
*/
public RythmEngine(org.rythmengine.RythmEngine engine) {
@@ -51,6 +51,16 @@ public class RythmEngine implements TemplateEngine {
return this;
}
+ /**
+ * 获取原始引擎的钩子方法,用于自定义特殊属性,如插件等
+ *
+ * @return {@link org.rythmengine.RythmEngine}
+ * @since 5.8.7
+ */
+ public org.rythmengine.RythmEngine getRawEngine() {
+ return this.engine;
+ }
+
/**
* 初始化引擎
* @param engine 引擎
@@ -69,7 +79,7 @@ public class RythmEngine implements TemplateEngine {
/**
* 创建引擎
- *
+ *
* @param config 模板配置
* @return {@link org.rythmengine.RythmEngine}
*/
@@ -77,7 +87,7 @@ public class RythmEngine implements TemplateEngine {
if (null == config) {
config = new TemplateConfig();
}
-
+
final Properties props = new Properties();
final String path = config.getPath();
if (null != path) {
diff --git a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/thymeleaf/ThymeleafEngine.java b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/thymeleaf/ThymeleafEngine.java
index 08c4a4fba..7ebeea2ea 100644
--- a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/thymeleaf/ThymeleafEngine.java
+++ b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/thymeleaf/ThymeleafEngine.java
@@ -15,7 +15,7 @@ import cn.hutool.extra.template.TemplateEngine;
/**
* Thymeleaf模板引擎实现
- *
+ *
* @author looly
* @since 4.1.11
*/
@@ -25,14 +25,16 @@ public class ThymeleafEngine implements TemplateEngine {
TemplateConfig config;
// --------------------------------------------------------------------------------- Constructor start
+
/**
* 默认构造
*/
- public ThymeleafEngine() {}
+ public ThymeleafEngine() {
+ }
/**
* 构造
- *
+ *
* @param config 模板配置
*/
public ThymeleafEngine(TemplateConfig config) {
@@ -41,7 +43,7 @@ public class ThymeleafEngine implements TemplateEngine {
/**
* 构造
- *
+ *
* @param engine {@link org.thymeleaf.TemplateEngine}
*/
public ThymeleafEngine(org.thymeleaf.TemplateEngine engine) {
@@ -51,7 +53,7 @@ public class ThymeleafEngine implements TemplateEngine {
@Override
public TemplateEngine init(TemplateConfig config) {
- if(null == config){
+ if (null == config) {
config = TemplateConfig.DEFAULT;
}
this.config = config;
@@ -61,23 +63,34 @@ public class ThymeleafEngine implements TemplateEngine {
/**
* 初始化引擎
+ *
* @param engine 引擎
*/
- private void init(org.thymeleaf.TemplateEngine engine){
+ private void init(org.thymeleaf.TemplateEngine engine) {
this.engine = engine;
}
@Override
public Template getTemplate(String resource) {
- if(null == this.engine){
+ if (null == this.engine) {
init(TemplateConfig.DEFAULT);
}
return ThymeleafTemplate.wrap(this.engine, resource, (null == this.config) ? null : this.config.getCharset());
}
+ /**
+ * 获取原始引擎的钩子方法,用于自定义特殊属性,如插件等
+ *
+ * @return {@link org.thymeleaf.TemplateEngine}
+ * @since 5.8.7
+ */
+ public org.thymeleaf.TemplateEngine getRawEngine() {
+ return this.engine;
+ }
+
/**
* 创建引擎
- *
+ *
* @param config 模板配置
* @return {@link TemplateEngine}
*/
@@ -85,38 +98,38 @@ public class ThymeleafEngine implements TemplateEngine {
if (null == config) {
config = new TemplateConfig();
}
-
+
ITemplateResolver resolver;
switch (config.getResourceMode()) {
- case CLASSPATH:
- final ClassLoaderTemplateResolver classLoaderResolver = new ClassLoaderTemplateResolver();
- classLoaderResolver.setCharacterEncoding(config.getCharsetStr());
- classLoaderResolver.setTemplateMode(TemplateMode.HTML);
- classLoaderResolver.setPrefix(StrUtil.addSuffixIfNot(config.getPath(), "/"));
- resolver = classLoaderResolver;
- break;
- case FILE:
- final FileTemplateResolver fileResolver = new FileTemplateResolver();
- fileResolver.setCharacterEncoding(config.getCharsetStr());
- fileResolver.setTemplateMode(TemplateMode.HTML);
- fileResolver.setPrefix(StrUtil.addSuffixIfNot(config.getPath(), "/"));
- resolver = fileResolver;
- break;
- case WEB_ROOT:
- final FileTemplateResolver webRootResolver = new FileTemplateResolver();
- webRootResolver.setCharacterEncoding(config.getCharsetStr());
- webRootResolver.setTemplateMode(TemplateMode.HTML);
- webRootResolver.setPrefix(StrUtil.addSuffixIfNot(FileUtil.getAbsolutePath(FileUtil.file(FileUtil.getWebRoot(), config.getPath())), "/"));
- resolver = webRootResolver;
- break;
- case STRING:
- resolver = new StringTemplateResolver();
- break;
- default:
- resolver = new DefaultTemplateResolver();
- break;
+ case CLASSPATH:
+ final ClassLoaderTemplateResolver classLoaderResolver = new ClassLoaderTemplateResolver();
+ classLoaderResolver.setCharacterEncoding(config.getCharsetStr());
+ classLoaderResolver.setTemplateMode(TemplateMode.HTML);
+ classLoaderResolver.setPrefix(StrUtil.addSuffixIfNot(config.getPath(), "/"));
+ resolver = classLoaderResolver;
+ break;
+ case FILE:
+ final FileTemplateResolver fileResolver = new FileTemplateResolver();
+ fileResolver.setCharacterEncoding(config.getCharsetStr());
+ fileResolver.setTemplateMode(TemplateMode.HTML);
+ fileResolver.setPrefix(StrUtil.addSuffixIfNot(config.getPath(), "/"));
+ resolver = fileResolver;
+ break;
+ case WEB_ROOT:
+ final FileTemplateResolver webRootResolver = new FileTemplateResolver();
+ webRootResolver.setCharacterEncoding(config.getCharsetStr());
+ webRootResolver.setTemplateMode(TemplateMode.HTML);
+ webRootResolver.setPrefix(StrUtil.addSuffixIfNot(FileUtil.getAbsolutePath(FileUtil.file(FileUtil.getWebRoot(), config.getPath())), "/"));
+ resolver = webRootResolver;
+ break;
+ case STRING:
+ resolver = new StringTemplateResolver();
+ break;
+ default:
+ resolver = new DefaultTemplateResolver();
+ break;
}
-
+
final org.thymeleaf.TemplateEngine engine = new org.thymeleaf.TemplateEngine();
engine.setTemplateResolver(resolver);
return engine;
diff --git a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/wit/WitEngine.java b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/wit/WitEngine.java
index 07ebb573b..4463f0f77 100755
--- a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/wit/WitEngine.java
+++ b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/wit/WitEngine.java
@@ -73,6 +73,16 @@ public class WitEngine implements TemplateEngine {
}
}
+ /**
+ * 获取原始引擎的钩子方法,用于自定义特殊属性,如插件等
+ *
+ * @return {@link Engine}
+ * @since 5.8.7
+ */
+ public Engine getRawEngine() {
+ return this.engine;
+ }
+
/**
* 创建引擎
*
diff --git a/hutool-extra/src/test/java/cn/hutool/extra/template/ThymeleafTest.java b/hutool-extra/src/test/java/cn/hutool/extra/template/ThymeleafTest.java
index 6101fa908..e82345ef3 100755
--- a/hutool-extra/src/test/java/cn/hutool/extra/template/ThymeleafTest.java
+++ b/hutool-extra/src/test/java/cn/hutool/extra/template/ThymeleafTest.java
@@ -1,5 +1,15 @@
package cn.hutool.extra.template;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.lang.Dict;
+import cn.hutool.extra.template.engine.thymeleaf.ThymeleafEngine;
+import org.junit.Assert;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.thymeleaf.context.Context;
+import org.thymeleaf.standard.StandardDialect;
+import org.thymeleaf.templateresolver.StringTemplateResolver;
+
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.HashMap;
@@ -8,23 +18,28 @@ import java.util.List;
import java.util.Locale;
import java.util.Map;
-import org.junit.Assert;
-import org.junit.Test;
-import org.thymeleaf.context.Context;
-import org.thymeleaf.templateresolver.StringTemplateResolver;
-
-import cn.hutool.core.date.DateUtil;
-import cn.hutool.core.lang.Dict;
-import cn.hutool.extra.template.engine.thymeleaf.ThymeleafEngine;
-
/**
* Thymeleaf单元测试
- *
+ *
* @author looly
*
*/
public class ThymeleafTest {
+ /**
+ * ...
+ * 自定义操作原始引擎
+ */
+ @Test
+ @Ignore
+ public void addDialectTest(){
+ final TemplateEngine engine = TemplateUtil.createEngine();
+ if(engine instanceof ThymeleafEngine){
+ final org.thymeleaf.TemplateEngine rawEngine = ((ThymeleafEngine) engine).getRawEngine();
+ rawEngine.addDialect(new StandardDialect());
+ }
+ }
+
@Test
public void thymeleafEngineTest() {
Map map1 = new HashMap<>();