Cela a été un problème assez courant ici dans stackOverflow, mais aucun des sujets du même problème ne résout le mien.
Nous avons une configuration de modèle qui utilise la configuration xml, mais maintenant nous essayons de nous éloigner de cela et de commencer à utiliser Java config.
J'ai donc un nouveau projet utilisant Java config et Spring Boot. Nous utilisons également JSP et Tiles 3.
Le problème est: il ne rend pas notre page de connexion administrateur.
Voici le code:
Classe de configuration principale:
@SpringBootApplication
@EnableScheduling
@Import(OnAdminBeans.class)
public class AppConfig extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(AppConfig.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(AppConfig.class);
}
}
Le AppConfig.class
is est le package principal. À travers le @ComponentScan
cette @SpringBootApplication
apporte, il scanne les autres configurations qui sont sur mainpackage.config
, il importe donc la classe de configuration de vue:
@Configuration
@EnableWebMvc
public class ViewConfig extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/adm/static/**").addResourceLocations("/adm/static/");
}
// @Override
// public void addViewControllers(ViewControllerRegistry registry) {
// registry.addViewController("/adm/login").setViewName("login-template-tiles");
// }
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.viewResolver(viewResolver());
registry.viewResolver(jspViewResolver());
registry.viewResolver(tilesViewResolver());
}
@Bean
public LocaleResolver localeResolver() {
CookieLocaleResolver localeResolver = new CookieLocaleResolver();
localeResolver.setCookieName("locale");
localeResolver.setCookieMaxAge(30);
localeResolver.setDefaultLocale(new Locale("pt", "BR"));
return localeResolver;
}
@Bean
public MultipleViewResolver viewResolver() {
Map<String, ViewResolver> viewsResolvers = new HashMap<String, ViewResolver>();
viewsResolvers.put(MultipleViewResolver.ViewType.JSP.getKey(), jspViewResolver());
viewsResolvers.put(MultipleViewResolver.ViewType.TILES.getKey(), tilesViewResolver());
MultipleViewResolver viewResolver = new MultipleViewResolver();
viewResolver.setViewsResolvers(viewsResolvers);
viewResolver.setOrder(1);
return viewResolver;
}
@Bean
public InternalResourceViewResolver jspViewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/jsp/");
viewResolver.setSuffix(".jsp");
viewResolver.setViewClass(JstlView.class);
viewResolver.setOrder(2);
return viewResolver;
}
@Bean
public UrlBasedViewResolver tilesViewResolver() {
UrlBasedViewResolver viewResolver = new UrlBasedViewResolver();
viewResolver.setViewClass(TilesView.class);
viewResolver.setOrder(3);
return viewResolver;
}
@Bean
public TilesConfigurer tilesConfigurer() {
TilesConfigurer configurer = new TilesConfigurer();
configurer.setDefinitions("/WEB-INF/tile-defs/tiles-definitions.xml");
return configurer;
}
}
Le LoginController.class
est défini comme:
@Controller
@RequestMapping(value = "/adm")
public class LoginController {
@RequestMapping(value = "/login")
public ModelAndView login() {
return new ModelAndView("login-template-tiles");
}
}
Et en tiles-definitions.xml
J'ai la définition suivante pour les tuiles de modèle de connexion:
<definition name="login-template-tiles" template="/WEB-INF/jsp/adm/templates/login-template.jsp">
<put-attribute name="admin-title" value="Admin" />
<put-attribute name="content" value="/WEB-INF/jsp/adm/templates/sections/login/index.jsp" />
</definition>
Notez que les deux fichiers existent.
Étant donné tout ce que le LoginController.login () est appelé lorsque j'essaie d'accéder /adm/login . Mais il ne parvient pas à trouver le fichier jsp approprié, apparemment.
Il renvoie un 404. Avec TRACE activé, j'obtiens le journal suivant:
DispatcherServlet with name 'dispatcherServlet' processing GET request for [/WEB-INF/jsp/adm/templates/login-template.jsp]
Testing handler map [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping@2118c09a] in DispatcherServlet with name 'dispatcherServlet'
Looking up handler method for path /WEB-INF/jsp/adm/templates/login-template.jsp
Did not find handler method for [/WEB-INF/jsp/adm/templates/login-template.jsp]
Testing handler map [org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping@2c148974] in DispatcherServlet with name 'dispatcherServlet'
No handler mapping found for [/WEB-INF/jsp/adm/templates/login-template.jsp]
Testing handler map [org.springframework.web.servlet.handler.SimpleUrlHandlerMapping@784c3547] in DispatcherServlet with name 'dispatcherServlet'
No handler mapping found for [/WEB-INF/jsp/adm/templates/login-template.jsp]
Testing handler map [org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport$EmptyHandlerMapping@533e0604] in DispatcherServlet with name 'dispatcherServlet'
Testing handler map [org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport$EmptyHandlerMapping@cfd1b4e] in DispatcherServlet with name 'dispatcherServlet'
No mapping found for HTTP request with URI [/WEB-INF/jsp/adm/templates/login-template.jsp] in DispatcherServlet with name 'dispatcherServlet'
Toutes les suggestions sont appréciées!
EDIT: Ok. En déboguant, j'ai découvert que cela avait quelque chose à voir avec le Tomcat intégré. A part ça, je n'ai aucune idée de ce qui se passe.
MODIFIER 2:
Trouvé que le problème est dans org.springframework.web.servlet.DispatcherServlet # getHandler. Il ne trouve tout simplement pas de HandlerMapping pour cette demande. Dois-je en enregistrer un?
D'ACCORD! Trouvé le problème.
Ce lien m'a aidé: https://samerabdelkafi.wordpress.com/2014/08/03/spring-mvc-full-Java-based-config/
Plus précisément cette configuration:
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
En définissant un gestionnaire par défaut, je n'obtiendrais plus une page blanche mais plutôt le code JSP en html, ce qui m'indique clairement que le JSP était trouvé mais pas rendu.
La réponse était donc sur cette page: le fichier JSP ne s'affiche pas dans l'application Web Spring Boot
Il me manquait l'artefact Tomcat-embed-jasper .
Les conseils ici m'ont aidé lorsque je suis resté coincé avec un problème similaire. Je l'ai corrigé après avoir ajouté ce fragment sur ma configuration
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
Ajoutez la dépendance ci-dessous à votre pom.xml
<dependency>
<groupId>org.Apache.Tomcat.embed</groupId>
<artifactId>Tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>