web-dev-qa-db-fra.com

Spring Boot donne "TemplateInputException: Erreur lors de la résolution du modèle" lors de l'exécution à partir du bocal

J'ai une application qui fonctionne parfaitement lorsqu'elle est lancée dans IntelliJ ou via gradle bootRun.

cependant, si je fais gradle bootRepackage et que j'essaie ensuite d'exécuter le pot résultant, je me retrouve avec:

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)

Je peux voir que le pot contient/templates/**. le contenu me semble OK.

Un facteur possible (?) Peut être que j'utilise une page html faisant référence à une mise en page, donc:

  layout:decorator="layouts/main"

Je peux confirmer que le fichier IS dans le bocal.

/ login est défini ainsi:

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

et j'ai la sécurité du ressort configurée comme:

@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();
}
}

Je pense que c'est tout ce qui pourrait être pertinent pour cette question ...

J'ai vu https://github.com/spring-projects/spring-boot/issues/112 et Emplacement correct des vues Thymeleaf pour le printemps (entre autres). Malgré ces ressources, je n'ai pas réussi à faire fonctionner la résolution de modèle.

Toutes les suggestions reçues avec reconnaissance.

Avoir fait si loin avec Spring Boot et avoir encore trébuché au dernier obstacle (déploiement presque final) est vexatoire.

10
Bob Brown

J'ai eu le même problème en utilisant Spring Boot avec Thymeleaf par configuration par défaut. Tout a fonctionné jusqu'à ce que je doive essayer .jar

le message dit: ... org.thymeleaf.exceptions.TemplateInputException: erreur de résolution du modèle "/ fragments/footer"

J'ai résolu de jouer avec /, le problème était qu'ils n'avaient pas besoin de la barre oblique.

J'ai changé ceci:

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

pour ça:

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

La réponse semble être ici: https://github.com/spring-projects/spring-boot/issues/1744

En bref: si un chemin de ressources contient '//', les choses tournent mal.

Le correctif est de modifier ainsi application.yml:

spring:
  thymeleaf:
    prefix: classpath:/templates

(le correctif est similaire pour un fichier .properties, bien sûr)

L'effet d'entraînement est que toutes les références aux modèles ou à tout autre élément doivent être précédées d'une barre oblique, comme dans (fichier Thymeleaf .html):

      layout:decorator="/layouts/main"

ou (contrôleur Groovy):

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

    "/home/home"
}

[~ # ~] Je [~ # ~] pense que la botte à ressort devrait résoudre ce problème. Instamment. C'est vraiment une mauvaise ergonomie qui explose mal, juste au moment où l'on a l'impression de se rapprocher du déploiement final.

5
Bob Brown

D'accord, j'ai trouvé où vous devez regarder de près. Dans vos classes Controller, lorsque vous utilisez @RequestMapping Sur la classe, pas de barre oblique (par exemple @RequestMapping("property")). Sur la méthode, vous avez besoin d'une barre oblique (par exemple @GetMapping("/list")) et la valeur de retour sans barre oblique (par exemple return "property/list";)

Un exemple d'extrait

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

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

J'ai rencontré le problème lors de l'utilisation de spring-boot-starter-thymeleaf dépendance

J'ai donc utilisé la dépendance ci-dessous à la place,

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

spring.thymeleaf.prefix = chemin de classe:/templates /

changement

@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");
}

le nom de la vue doit être Chemin relatif

0
s332401890

Si les solutions ci-dessus ne fonctionnent pas pour vous, comme moi,

J'ai changé mon contrôleur en RestController. Cela a résolu mon problème.

En effet, si vous utilisez une application frontale comme Angular pour parler à votre application back-end.

0

Après de nombreuses tentatives, j'ai trouvé un moyen de résoudre mon problème concernant l'erreur de modèle. Je ne sais pas si c'est lié à la nouvelle version de Spring-Boot mais mon changement a fonctionné.

Chaque requête via le contrôleur au lieu de renvoyer la chaîne "/ login", par exemple, je change pour créer un objet ModelAndView:

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

câlins à tous.

0
Paulo Cesar Pengo