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

This has been a quite common problem here in stackOverflow, but none of the topics of the same problem solves mine.

We have a template configuration that uses xml config, but now we're trying to move away from that and start using Java config.

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.

Here is the code:

Main config class:

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

}

}

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 viewsResolvers = new HashMap();

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;

}

}

The LoginController.class is defined as:

@Controller

@RequestMapping(value = "/adm")

public class LoginController {

@RequestMapping(value = "/login")

public ModelAndView login() {

return new ModelAndView("login-template-tiles");

}

}

And in tiles-definitions.xml I have the following definition for login-template-tiles:

Note that both files exist.

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.

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'

Any suggestions are appreciated!

EDIT:

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.

EDIT 2:

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?

解决方案

OK! Found the problem.

More specifically this configuration:

@Override

public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {

configurer.enable();

}

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.

I was missing the tomcat-embed-jasper artifact.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值