2015-05-22 53 views
8

这在stackOverflow中是一个相当常见的问题,但没有任何相同问题的主题解决我的问题。Spring Boot,Java Config - 在名为'dispatcherServlet'的DispatcherServlet中找不到具有URI [/ ...]的HTTP请求的映射

我们有一个使用xml配置的模板配置,但现在我们试图摆脱这种情况并开始使用Java配置。

所以我有一个使用Java配置和Spring Boot的新项目。我们还使用JSP和Tiles 3.

问题是:它无法呈现我们的管理登录页面。

下面是代码:

主要配置类:

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

AppConfig.class是是主要的包。通过@SpringBootApplication带来的@ComponentScan,它会扫描上mainpackage.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; 
    } 
} 

LoginController.class被定义为:

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

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

而在tiles-definitions.xml我有以下为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> 

请注意,两个文件都存在。

鉴于这一切的LoginController.login()不会被调用当我尝试访问/ADM /登录。但它无法正常地找到合适的jsp文件。

它返回一个。随着TRACE启用,我得到以下日志:

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' 

任何建议表示赞赏!

编辑: 好的。通过调试,我发现它与嵌入式Tomcat有关。除此之外,我不知道发生了什么。

编辑2:

发现问题是在org.springframework.web.servlet.DispatcherServlet#getHandler。它根本找不到该请求的HandlerMapping。我需要注册吗?

回答

16

好的!发现问题。

此链接帮助我:https://samerabdelkafi.wordpress.com/2014/08/03/spring-mvc-full-java-based-config/

更具体地说,本配置:

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

通过设置默认的处理程序,我将不再得到一个白色的页面,而是JSP代码为HTML,这显然告诉我JSP已被找到但未呈现。

所以答案是这个网页上:JSP file not rendering in Spring Boot web application

我错过了Tomcat的嵌入,碧玉神器。

+0

帮我继续:) – Krishna

0

添加下面的依赖于你的pom.xml

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

我面临同样的问题,增加Tomcat的嵌入,碧玉到pom.xml的,但它被重定向默认错误页。我试着添加bean InteralResourceViewResolver,它工作。 – Bheeman

相关问题