J'essaie de faire une application "hello world" avec gradle, spring boot et spring mvc avec le résolveur de vues et le html les plus simples.
J'ai commencé à partir du exemple de démarrage de thymeleaf spring et je voulais simplement supprimer thymeleaf pour créer une application mvc plus simple à l'aide de HTML pur et de InternalResourceViewResolver. J'ai une seule salutation.html Je veux servir, située à l'adresse src/main/webapp/WEB-INF. Quand je lance l'application, je reçois
No mapping found for HTTP request with URI [/WEB-INF/greeting.html] in DispatcherServlet with name 'dispatcherServlet'
C'est une erreur courante et il y a beaucoup de réponses sur le web, mais rien ne semble aider.
Voici mon application.Java
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Voici mon GreetingController.Java
@Controller
public class GreetingController {
@RequestMapping("/greeting")
public String greeting() {
return "greeting";
}
}
Voici mon MvcConfiguration.Java
@Configuration
@EnableWebMvc
public class MvcConfiguration extends WebMvcConfigurerAdapter{
@Bean
public ViewResolver getViewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/");
resolver.setSuffix(".html");
return resolver;
}
}
Je le lance avec gradle bootRun
Voici le repo avec le code: https://github.com/driver-pete/spring-mvc-example
Voici quelques indices supplémentaires:
Mon hypothèse est que les servlets répartiteurs sont configurés de manière à servir sur/* au lieu de/comme ici et partout. Cependant, je n'ai pas web.xml, donc ces conseils ne s'appliquent pas ici. Je vois beaucoup d'exemples sur la façon de configurer le servlet Dispatcher par programmation, mais je veux garder mon application au minimum et je soupçonne que Spring Boot est censé le configurer correctement car il fonctionne bien avec thymeleaf.
Vous devez uniquement activer le servlet par défaut. Pour ce faire, ajoutez les éléments suivants à votre MvcConfiguration
:
@Configuration
@EnableWebMvc
public class MvcConfiguration extends WebMvcConfigurerAdapter{
@Bean
public ViewResolver getViewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/");
resolver.setSuffix(".html");
return resolver;
}
@Override
public void configureDefaultServletHandling(
DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}
Ce qui se passe en réalité, c'est que Spring ne sait pas comment gérer le traitement de ce contenu de manière native (par exemple, jsp), et cette configuration est le moyen de lui indiquer de le déléguer au conteneur.
Après avoir étudié davantage, j'ai découvert une solution alternative qui fonctionne sans ajouter de méthode configureDefaultServletHandling. Vous devez ajouter un moteur jsp Tomcat intégré à build.gradle:
compile("org.Apache.Tomcat.embed:Tomcat-embed-jasper")
Contrairement à la méthode configureDefaultServletHandling, cette solution fonctionne non seulement avec le langage HTML mais également avec jsp.
Toutes les solutions sont disponibles à l'adresse suivante: https://github.com/driver-pete/spring-mvc-example Cette solution est disponible à la base. La solution de Biju se trouve sur la branche DefaultServletHandling_solution.
Le résolveur de vues peut également être configuré dans application.properties
fichier des applications Web Spring-Boot, comme ci-dessous:
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp