Spring Boot,Java Config - 在DispatcherServlet中找不到带有URI [/ ...]的HTTP请求的映射,名称为“dispatcherServlet” [英] Spring Boot, Java Config - No mapping found for HTTP request with URI [/...] in DispatcherServlet with name 'dispatcherServlet'
问题描述
这在stackOverflow中是一个非常常见的问题,但同一问题的主题都没有解决我的问题。
This has been a quite common problem here in stackOverflow, but none of the topics of the same problem solves mine.
我们有一个使用xml配置的模板配置,但现在我们正试图摆脱它并开始使用Java配置。
We have a template configuration that uses xml config, but now we're trying to move away from that and start using Java config.
所以我有一个使用Java配置和Spring Boot的新项目。我们也使用JSP和Tiles 3.
So I have a new project using Java config and Spring Boot. We're also using JSP and Tiles 3.
问题是:它无法呈现我们的管理员登录页面。
Problem is: it fails to render our admin login page.
以下是代码:
主要配置类:
@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
是主包。通过 @ComponentScan
@SpringBootApplication
带来,它会扫描 mainpackage上的其他配置.config
,所以它导入了视图配置类:
The AppConfig.class
is is the main package. Through the @ComponentScan
that @SpringBootApplication
brings, it scans the other configurations that are on mainpackage.config
, so it imports the view config class:
@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有以下定义:
And in tiles-definitions.xml
I have the following definition for 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>
请注意,这两个文件都存在。
Note that both files exist.
鉴于我尝试访问 / adm / login 时,所有 LoginController.login() 被调用。但它无法找到合适的jsp文件,显然。
Given all that the LoginController.login() does get called when i try to access /adm/login. But it fails to find the proper jsp file, aparently.
它返回 404 。启用TRACE后,我得到以下日志:
It returns a 404. With TRACE enabled, I get the following log:
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'
任何建议都表示赞赏!
编辑:
好的。通过调试,我发现它与嵌入式Tomcat有关。除此之外,我不知道发生了什么。
Ok. By debugging, I found out that it has something to do with the embedded Tomcat. Other than that, I have no clue what is going on.
编辑2:
发现问题出在 org.springframework.web.servlet.DispatcherServlet #getHandler 中。它根本找不到该请求的HandlerMapping。我必须注册吗?
Found that the problem is in org.springframework.web.servlet.DispatcherServlet#getHandler. It simply doesn't find a HandlerMapping for that request. Do I have to register one?
推荐答案
好的!发现问题。
此链接帮助了我: https://samerabdelkafi.wordpress.com/2014/08/03/spring-mvc-full-java-based-config/
更具体地来说,这个配置:
More specifically this configuration:
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
通过设置默认处理程序,我将不再获得白页,而是JSP代码为html,它清楚地告诉我JSP正在被找到但没有被渲染。
By setting a default handler, I would no longer get a white page but instead the JSP code as html, which clearly tells me that the JSP was being found but not rendered.
所以答案就在这个页面上:在Spring Boot Web应用程序中无法呈现JSP文件
So the answer was on this page: JSP file not rendering in Spring Boot web application
我错过了 tomcat-embed-jasper 工件。
这篇关于Spring Boot,Java Config - 在DispatcherServlet中找不到带有URI [/ ...]的HTTP请求的映射,名称为“dispatcherServlet”的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!