3

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

为此,我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 会返回错误的视图,或者会出现解决此类问题的冲突。

4

1 回答 1

15

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

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

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

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

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

于 2012-11-26T11:54:18.617 回答