web-dev-qa-db-ja.com

jarから実行すると、Spring Bootで「TemplateInputException:Error resolving template」が発生する

IntelliJ内またはgradle bootRun経由で起動したときに完全に機能するアプリがあります。

ただし、bootRepackageをgradleしてから、生成されたjarを実行しようとすると、次のようになります。

2014-12-02 21:46:14.086 ERROR 9839 --- [nio-2014-exec-2] org.thymeleaf.TemplateEngine             : [THYMELEAF][http-nio-2014-exec-2] Exception processing template "/login": Error resolving template "/login", template might not exist or might not be accessible by any of the configured Template Resolvers
2014-12-02 21:46:14.087 ERROR 9839 --- [nio-2014-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateInputException: Error resolving template "/login", template might not exist or might not be accessible by any of the configured Template Resolvers] with root cause

org.thymeleaf.exceptions.TemplateInputException: Error resolving template "/login", template might not exist or might not be accessible by any of the configured Template Resolvers
    at org.thymeleaf.TemplateRepository.getTemplate(TemplateRepository.Java:245)
    at org.thymeleaf.TemplateEngine.process(TemplateEngine.Java:1104)
    at org.thymeleaf.TemplateEngine.process(TemplateEngine.Java:1060)
    at org.thymeleaf.TemplateEngine.process(TemplateEngine.Java:1011)
    at org.thymeleaf.spring4.view.ThymeleafView.renderFragment(ThymeleafView.Java:335)

Jarには/ templates/**が含まれていることがわかります。コンテンツは私には問題ないようです。

1つの可能な(?)要因は、レイアウトを参照するhtmlページを使用することです。したがって、

  layout:decorator="layouts/main"

ファイルIS jar内にあることを確認できます。

/ loginは次のように定義されます。

@Override
public void addViewControllers(ViewControllerRegistry registry) {
    registry.addViewController("/login").setViewName("/login");
    registry.addViewController("/").setViewName("/login");
}

そして、私は次のように設定された春のセキュリティを持っています:

@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

@Override
public void configure(WebSecurity security) {
    security.ignoring().antMatchers("/assets/**");
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
            .csrf().disable();
    http
            .authorizeRequests()
            .antMatchers("/").permitAll()
            .anyRequest().authenticated();
    http
            .formLogin()
            .loginPage("/login")
            .defaultSuccessUrl("/home")
            .failureUrl("/login?error")
            .permitAll()
            .and()
            .logout()
            .invalidateHttpSession(true)
            .logoutSuccessUrl("/login?logout")
            .permitAll();
}
}

この問題に関連するのはそれだけだと思います...

https://github.com/spring-projects/spring-boot/issues/112SpringのThymeleafビューの適切な場所 (他の中でも)を見てきました。これらのリソースにもかかわらず、私はテンプレート解決を機能させることに成功していません。

提案はありがたいことに受け取った。

Spring Bootでこれまでのところ、最後のハードル(最終段階の展開)でつまずいたことがないのは大変なことです。

10
Bob Brown

デフォルト設定でthymeleafでスプリングブートを使用すると、同じ問題が発生しました。 .jarを試してみるまで、すべてうまくいきました。

メッセージは言う:... org.thymeleaf.exceptions.TemplateInputException:テンプレート「/ fragments/footer」の解決エラー

/で遊んで解決したのは、スラッシュが必要ないという問題でした。

これを変更しました:

<footer class="footers" th:replace="/fragments/footer :: footer">

このため:

<footer class="footers" th:replace="fragments/footer :: footer">
6
user2822874

答えはここにあるようです: https://github.com/spring-projects/spring-boot/issues/1744

簡単に言うと、リソースパスに「//」が含まれていると、問題が発生します。

修正はapplication.ymlをこうして修正することです:

spring:
  thymeleaf:
    prefix: classpath:/templates

(もちろん、修正は.propertiesファイルでも同様です)

ノックオン効果は、テンプレートへのすべての参照、または(Thymeleaf .htmlファイル)のようにスラッシュが先行する必要のあるものです:

      layout:decorator="/layouts/main"

または(Groovyコントローラー):

@RequestMapping(value = "/home", method = RequestMethod.GET)
def home(Model model, Principal principal) {

    "/home/home"
}

[〜#〜] i [〜#〜]スプリングブートはこれを修正する必要があると思います。早急に。これは本当に悪いエルゴノミクスであり、最終的な展開に近づいているように感じる時点でひどく爆発します。

5
Bob Brown

さて、あなたがよく見る場所を見つけました。コントローラークラスでは、クラスで_@RequestMapping_を使用すると、先頭にスラッシュは付きません(例:@RequestMapping("property"))。メソッドでは、先頭にスラッシュ(例:@GetMapping("/list"))と戻り値に先頭にスラッシュがありません(例:_return "property/list";_)

サンプルスニペット

_@Controller
@RequestMapping("property")
public class PropertyController {
    @NonNull PropertyService service;

    @GetMapping("/list")
    public String list() {
        return "property/list";
    }
}
_
5
Michael Hegner

spring-boot-starter-thymeleaf依存関係を使用するときに問題に直面しました

そのため、代わりに以下の依存関係を使用しました。

        <dependency>
            <groupId>org.thymeleaf</groupId>
            <artifactId>thymeleaf</artifactId>
            <version>3.0.9.RELEASE</version>
        </dependency>
0

spring.thymeleaf.prefix = classpath:/ templates /

変化する

@Override
public void addViewControllers(ViewControllerRegistry registry) {
    registry.addViewController("/login").setViewName("/login");
    registry.addViewController("/").setViewName("/login");
}

@Override
public void addViewControllers(ViewControllerRegistry registry) {
    registry.addViewController("/login").setViewName("login");
    registry.addViewController("/").setViewName("login");
}

ビュー名は相対パスである必要があります

0
s332401890

上記の解決策がうまくいかない場合は、私のように、

コントローラーをRestControllerに変更しました。それは私の問題を修正しました。

これは、Angularなどのフロントエンドアプリを使用してバックエンドアプリケーションと通信する場合です。

多くの暫定措置の後、テンプレートエラーに関する問題を解決する方法を見つけました。 spring-bootの新しいバージョンに関連するかどうかはわかりませんが、私の変更は機能しました。

たとえば、ストリング "/ login"を返す代わりにコントローラーを介したすべての要求は、オブジェクトModelAndViewを作成するように変更します。

@RequestMapping(value="/login", method=RequestMethod.GET)
public ModelAndView login() {
    ModelAndView mv = new ModelAndView("login");
    return mv;
}

すべてに抱擁します。

0