1

複数のソースからのデータがいくつかのデータ構造に処理されるプロジェクトがあります。プログラムがこれらの構造の構築を完了したら、ユーザーがこれらの構造を手動で微調整できるサーバーをセットアップする必要があります。私は、Spring Boot を使用してセットアップされた組み込み Tomcat サーバー上の Spring MVC がまさに必要なものであると判断しました。

ビューテクノロジーとしてThymeleafを使用したいので、そうしました

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Main {

    public static void main(String... args) throws Exception {
        // Lots of initialization ...

        SpringApplication.run(Main.class, args);
    }

    @Bean
    public ServletContextTemplateResolver templateResolver() {
        ServletContextTemplateResolver resolver = new ServletContextTemplateResolver();
        resolver.setPrefix("/resources/views/");
        resolver.setSuffix(".html");
        resolver.setTemplateMode("HTML5");
        resolver.setCacheable(false);
        return resolver;

    }

    public SpringTemplateEngine templateEngine() {
        SpringTemplateEngine engine = new SpringTemplateEngine();
        engine.setTemplateResolver(templateResolver());
        return engine;
    }

    @Bean
    public ViewResolver viewResolver() {
        ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
        viewResolver.setTemplateEngine(templateEngine());
        viewResolver.setOrder(1);
        viewResolver.setViewNames(new String[]{"*"});
        viewResolver.setCache(false);
        return viewResolver;
    }
}

@Controller
public class WebController {
    @RequestMapping(value="/greeting", method=RequestMethod.GET)
    public String greeting() {
        return "greeting";
    }
}

しかし、 にビュー ファイルがあっても/resources/views/greeting.html、サーバーの URL への応答http://localhost:8080/greeting

org.thymeleaf.exceptions.TemplateInputException: Error resolving template "greeting", template might not exist or might not be accessible by any of the configured Template Resolvers

デバッガーでコードをステップ実行すると、ある時点でServletContext、ビュー ファイルをストリームとして返すはずの が、次のような一時フォルダーを参照しているように見えます。

C:\Users\Michael\AppData\Local\Temp\tomcat-docbase.971027024999448548.8080

空です。

今、私はどちらかをする必要があることを理解しています

  1. サーバーの起動時にリソースを一時フォルダーにデプロイする

  2. リソースがすでに存在するディレクトリでサーバーを動作させる

私の問題は、どちらを行うか、またはどのアプローチが最適かがわからないことです。1がより良い知恵であると何かが私に言っていますが、どんな提案も大歓迎です。

編集

わかりました、私はうまくいくように見えるものになりました。ジョーの答えは確かに私が道を進むのに役立ちましたが、私を困惑させる方法でMavenの構成を変更しなければならなかったようです.

テンプレートを入れてビルドパスgreeting.html/resources/templates/greeting.html追加resourcesした後、エラーが発生しました

javax.servlet.ServletException: Circular view path [greeting]: would dispatch back to the current handler URL [/word/greeting] again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.)

つまり、Thymeleaf が適切に構成されていないように見えました。いくつかいじった後、 in のバージョンを から に変更することにspring-boot-starter-parentなりpom.xmlまし0.5.0.BUILD-SNAPSHOT0.5.0.M6

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <!--<version>0.5.0.BUILD-SNAPSHOT</version>-->
    <version>0.5.0.M6</version>
</parent>

Thymeleaf依存関係からバージョンタグを削除します

<dependencies>
    <!-- ... -->
    <dependency>
        <groupId>org.thymeleaf</groupId>
        <artifactId>thymeleaf-spring3</artifactId>
        <!--<version>${thymeleaf-spring3-version}</version>-->
    </dependency>
</dependencies>

この後、うまくいきました。

spring-boot-starter-parentからバージョン タグを削除できるようにのバージョンを変更する必要があったthymeleaf-spring3理由と、それが必要だった理由を説明してください。

4

1 に答える 1

3

サーブレット コンテキスト ルートは、組み込みサーバーのテンプレートに最適な場所ではありません。それを行う方法はありますが、私があなたなら、流れに乗ってクラスパスを使用します。Spring Boot がテンプレート リゾルバーを構成できるようにすると (これも推奨されます) classpath:/templates、デフォルトで検索されます。ブート コード ベースで thymeleaf を使用するサンプルがいくつかあるため、要件が異なる場合は、そのうちの 1 つを簡単に変更できます。

于 2014-01-04T09:35:36.473 に答える