3

Thymeleaf + Spring 3チュートリアルを読んでいて、モジュラーアプリケーションを構築しようとしています。私の目標は、クラスパスの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が間違ったビューを返すか、そのような問題を解決するために競合が発生すると思います。

4

1 に答える 1

15

基本クラスITemplateResolverを拡張するインターフェイスの実装(すべてのすぐに使用可能な実装と同様)には、特定のテンプレートによって解決可能と見なされるビューを決定するために適用される一連のパターンを指定できるプロパティがあります。エンジン。これは、衝突を回避するのに役立ちます。org.thymeleaf.templateresolver.AbstractTemplateResolverresolvablePatterns

admin/*そこで、、などのワイルドカードパターンを指定できますuser/*/create

これらのパターンは、テンプレートファイル名自体ではなく、ビュー名に適用されることに注意してください。たとえば、テンプレートが/WEB-INF/templates/index.htmlであり、ビューリゾルバーがプレフィックス/WEB-INF/templates/とサフィックスを追加する場合.htmlビュー名indexであるため、のような解決可能なパターン*.htmlは一致しません。

また、orderテンプレートリゾルバーがビューを解決するように求められる順序を確立するプロパティがあります。

StackOverflowルールで要求される免責事項:私はThymeleafの作成者です。

于 2012-11-26T11:54:18.617 に答える