gpt4 book ai didi

java - Spring Boot,Java Config - 在 DispatcherServlet 中找不到带有 URI [/...] 的 HTTP 请求的映射,名称为 'dispatcherServlet'

转载 作者:IT老高 更新时间:2023-10-28 13:45:00 30 4
gpt4 key购买 nike

这在 stackOverflow 中是一个很常见的问题,但没有一个相同问题的主题能解决我的问题。

我们有一个使用 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上的其他配置,导入 View 配置类:

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

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

当我尝试访问 /adm/login 时,LoginController.login() 确实会被调用。但它显然无法找到正确的 jsp 文件。

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

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有关。除此之外,我不知道发生了什么。

编辑 2:

发现问题出在org.springframework.web.servlet.DispatcherServlet#getHandler。它根本找不到该请求的 HandlerMapping。我必须注册一个吗?

最佳答案

好的!发现问题了。

这个链接帮助了我: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-embed-jasper 工件。

关于java - Spring Boot,Java Config - 在 DispatcherServlet 中找不到带有 URI [/...] 的 HTTP 请求的映射,名称为 'dispatcherServlet',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30406186/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com