web-dev-qa-db-fra.com

Spring Boot, Java Config - Aucun mappage trouvé pour la requête HTTP avec l'URI [/ ...] dans DispatcherServlet avec le nom 'dispatcherServlet'

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?

11
Glauber Néspoli

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 .

22
Glauber Néspoli

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();
}
4
Venki Ram

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>
4
Bheeman