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.
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">
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.
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";
}
}
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>
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
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.
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.