java - Thymeleaf 中的模块化模板解析器

标签 java spring spring-mvc thymeleaf

我正在阅读 Thymeleaf + Spring 3 Tutorial并且还尝试构建模块化应用程序。我的目标是能够从类路径中的 Jars 加载 thymeleaf 模板。

为此,我配置了 SpringTemplateEngine在下一个 xml 中:

<bean id="templateEngine" class="org.thymeleaf.spring3.SpringTemplateEngine">
    <property name="templateResolvers">
        <util:set>
            <ref bean="servletContextTemplateResolver" />
            <ref bean="classpathPluginTemplateResolver" />
        </util:set>
    </property>
</bean>

<bean id="classpathPluginTemplateResolver"
    class="org.mael.codex.arcana.web.thymeleaf.templates.ClasspathPluginTemplateResolver">
    <property name="prefix" value="/META-INF/codexarcana/plugin/views" />
    <property name="suffix" value=".html" />
    <property name="templateMode" value="HTML5" />
</bean>

和 ClasspathPluginTemplateResolver 代码:
public class ClasspathPluginTemplateResolver extends TemplateResolver {

public ClasspathPluginTemplateResolver() {
    super();
    super.setResourceResolver(new ClasspathTemplateResolver());
}

@Override
public void setResourceResolver(IResourceResolver resourceResolver) {
    throw new ConfigurationException("Cannot set a resource resolver on "
            + this.getClass().getName() + ". If "
            + "you want to set your own resource resolver, use "
            + TemplateResolver.class.getName() + "instead");
}
}

和 ClasspathTemplateResolver:
public class ClasspathTemplateResolver implements IResourceResolver {

@Override
public String getName() {
    return this.getClass().getSimpleName();
}

@Override
public InputStream getResourceAsStream(
        TemplateProcessingParameters templateProcessingParameters,
        String resourceName) {

    if (resourceName == null || resourceName.isEmpty()) {
        throw new IllegalArgumentException("Resource name cannot be null");
    }

    try {
        return new ClassPathResource(resourceName).getInputStream();
    } catch (IOException e) {
        throw new RuntimeException("Cannot open resource '" + resourceName
                + "'", e);
    }
}

}

如何避免 ClasspathPluginTemplateResolver 解析的模板中的名称冲突?

例子:

假设我有 2 个具有此目录结构的插件:
codexarcana-poll-plugin.jar
    ----/META-INF/codexarcana/plugin/views/wizard.html


codexarcana-gravatar-plugin.jar
    ----/META-INF/codexarcana/plugin/views/wizard.html

在这种情况下,我相信 ClasspathTemplateResolver 会返回错误的 View ,或者会出现解决此类问题的冲突。

最佳答案

ITemplateResolver 的实现扩展基础的接口(interface)org.thymeleaf.templateresolver.AbstractTemplateResolver类(就像所有开箱即用的实现一样)有一个 resolvablePatterns属性,允许您指定一系列模式,这些模式将用于确定哪些 View 将被该特定模板引擎视为可解析。这应该可以帮助您避免碰撞。

在那里您可以指定通配符模式,例如 admin/* , user/*/create , ETC。

请记住,这些模式适用于 查看名称 ,而不是模板文件名本身。例如,如果您的模板是 /WEB-INF/templates/index.html并且您的 View 解析器添加前缀 /WEB-INF/templates/和后缀 .html ,您的 View 名称是 index ,因此是一个可解析的模式,如 *.html永远不会匹配。

此外,还有一个 order确定模板解析器被要求解析 View 的顺序的属性。

免责声明,根据 StackOverflow 规则的要求:我是 Thymeleaf 的作者。

关于java - Thymeleaf 中的模块化模板解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13543877/

相关文章:

java - 从 eclipse 执行时 Spring 4.1.7 + Junit 4.12 不工作

java - JWT 自定义过滤器中的身份验证管理器

java - 测试 Spring MVC 时不断收到 404 错误

java - 将对象从下拉列表 (.jsp) 传递到 Controller

Spring MVC 无需请求即可获取WEB-INF下的文件

java - MVC 与 Netbeans 表单生成器

java - tomcat7 在 ubuntu 中用 spring 循环请求。怎么修?

java - 曼哈顿布局算法

java - 使用 MifareUltralight.transceive 在 Android 中设置 NTAG213 密码崩溃,没有抛出异常

java - 无法使用 hibernate 插入数据库