2015-05-22 7 views
8

Questo è stato un problema abbastanza comune qui in stackOverflow, ma nessuno degli argomenti dello stesso problema risolve il mio.Spring Boot, Java Config - Nessuna mappatura trovata per richiesta HTTP con URI [/ ...] in DispatcherServlet con nome 'dispatcherServlet'

Abbiamo una configurazione di modello che utilizza xml config, ma ora stiamo cercando di allontanarci da quello e iniziare a utilizzare la configurazione di Java.

Quindi ho un nuovo progetto che utilizza Java config e Spring Boot. Stiamo anche utilizzando JSP e Tiles 3.

Il problema è: non riesce a visualizzare la pagina di accesso dell'amministratore.

Ecco il codice:

principale classe di configurazione:

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

Il AppConfig.class è è il pacchetto principale. Attraverso la @ComponentScan che @SpringBootApplication porta, scansiona le altre configurazioni che sono in mainpackage.config, quindi importa la classe di visualizzazione config:

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

Il LoginController.class è definito come:

@Controller 
@RequestMapping(value = "/adm") 
public class LoginController { 

    @RequestMapping(value = "/login") 
    public ModelAndView login() { 
     return new ModelAndView("login-template-tiles"); 
    } 
} 

E tiles-definitions.xml ho la seguente definizione per login-template-tiles:

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

Nota che entrambi i file esistono .

Considerato tutto ciò che la LoginController.login()venga chiamato quando provo ad accedere /adm/login. Ma non riesce a trovare il file jsp corretto, in modo univoco.

Restituisce un . Con TRACE abilitato, ottengo il seguente registro:

DispatcherServlet with name 'dispatcherServlet' processing GET request for [/WEB-INF/jsp/adm/templates/login-template.jsp] 

Testing handler map [org.springframework[email protected]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 [or[email protected]2c148974] in DispatcherServlet with name 'dispatcherServlet' 

No handler mapping found for [/WEB-INF/jsp/adm/templates/login-template.jsp] 

Testing handler map [[email protected]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.c[email protected]533e0604] in DispatcherServlet with name 'dispatcherServlet' 

Testing handler map [org.springframework.web.servlet.c[email protected]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' 

Qualsiasi suggerimento è apprezzato!

MODIFICA: Ok. Con il debug, ho scoperto che ha qualcosa a che fare con il Tomcat incorporato. Oltre a questo, non ho idea di cosa sta succedendo.

EDIT 2:

hanno scoperto che il problema è nella org.springframework.web.servlet.DispatcherServlet # getHandler. Semplicemente non trova un HandlerMapping per quella richiesta. Devo registrarne uno?

risposta

16

OK! Trovato il problema

Questo link mi ha aiutato: https://samerabdelkafi.wordpress.com/2014/08/03/spring-mvc-full-java-based-config/

In particolare questa configurazione:

@Override 
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { 
     configurer.enable(); 
    } 

Impostando un gestore predefinito, non sarei più ottenere una pagina bianca, ma invece il codice JSP come html, che chiaramente mi dice che il JSP è stato trovato ma non reso.

Quindi la risposta era in questa pagina: JSP file not rendering in Spring Boot web application

mi mancava il tomcat-embed-Jasper artefatto.

+0

questo mi ha aiutato a proseguire :) – Krishna

0

Aggiungi sotto la dipendenza al pom.xml

<dependency> 
     <groupId>org.apache.tomcat.embed</groupId> 
     <artifactId>tomcat-embed-jasper</artifactId> 
     <scope>provided</scope> 
    </dependency> 
+0

stavo affrontando lo stesso problema, ha aggiunto tomcat-embed-Jasper a pom.xml ma è stato riorientando pagina di errore predefinita . Ho provato ad aggiungere bean InteralResourceViewResolver e ha funzionato. – Bheeman