Configure ViewResolver with Spring Boot and annotations 给出 No mapping found for HTTP request with URI 错误
Configure ViewResolver with Spring Boot and annotations gives No mapping found for HTTP request with URI error
我正在尝试使用 gradle、spring 引导和 spring mvc 使用最简单的视图解析器和 html 制作 "hello world" 应用程序。
我从 thymeleaf spring boot example 开始,我只是想删除 thymeleaf 以使用纯 html 和 InternalResourceViewResolver 制作一个更简单的 mvc 应用程序。我有一个 greeting.html 我想提供,它位于 src/main/webapp/WEB-INF。当我 运行 应用程序时,我得到
No mapping found for HTTP request with URI [/WEB-INF/greeting.html] in DispatcherServlet with name 'dispatcherServlet'
这是一个常见错误,网上有很多答案,但似乎没有任何帮助。
这是我的 Application.java
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
这是我的 GreetingController.java
@Controller
public class GreetingController {
@RequestMapping("/greeting")
public String greeting() {
return "greeting";
}
}
这是我的 MvcConfiguration.java
@Configuration
@EnableWebMvc
public class MvcConfiguration extends WebMvcConfigurerAdapter{
@Bean
public ViewResolver getViewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/");
resolver.setSuffix(".html");
return resolver;
}
}
我运行它和gradle bootRun
这是带有代码的回购协议:https://github.com/driver-pete/spring-mvc-example
这里还有一些线索:
- Thymeleaf 视图解析工作正常
- InternalResourceViewResolver 解析到正确的路径
- WEB-INF 和 greeting.html 似乎存在于 war 文件中
- 我没有 jsp 或 jstl 所以我不会像某些人建议的那样错过那些罐子
我的假设是,调度程序 servlet 以某种方式配置为在 /* 而不是 / 上服务,例如 here 和无处不在。但是我没有 web.xml 所以这些建议在这里不适用。我看到了很多如何以编程方式配置调度程序 servlet 的示例,但我想将我的应用程序保持在最低限度,并且我怀疑 spring boot 应该可以配置它,因为它可以与 thymeleaf 一起正常工作。
您只需要启用默认的 servlet,这是通过将以下内容添加到您的 MvcConfiguration
:
@Configuration
@EnableWebMvc
public class MvcConfiguration extends WebMvcConfigurerAdapter{
@Bean
public ViewResolver getViewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/");
resolver.setSuffix(".html");
return resolver;
}
@Override
public void configureDefaultServletHandling(
DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}
本质上发生的事情是 Spring 不知道如何本地处理此类内容的处理(可能是 jsp 说),并且此配置是告诉它的方式委托给容器。
经过更多调查后,我发现了一个无需添加 configureDefaultServletHandling 方法即可工作的替代解决方案。您需要将嵌入式 tomcat jsp 引擎添加到 build.gradle:
compile("org.apache.tomcat.embed:tomcat-embed-jasper")
与 configureDefaultServletHandling 方法相反,此解决方案不仅适用于普通 html,而且适用于 jsp.
所有解决方案都可以在以下位置找到:https://github.com/driver-pete/spring-mvc-example
此解决方案在 master 上可用。
Biju 的解决方案在 DefaultServletHandling_solution 分支上。
视图解析器也可以在 Spring-Boot 网络应用程序的 application.properties
文件中配置,如下所示:
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
如果您使用的是 5.0 以上的 spring,则使用 org.springframework.web.servlet.view.InternalResourceViewResolver
代替
org.springframework.web.servlet.InternalResourceViewResolver
在你的 bean 定义中
我正在尝试使用 gradle、spring 引导和 spring mvc 使用最简单的视图解析器和 html 制作 "hello world" 应用程序。
我从 thymeleaf spring boot example 开始,我只是想删除 thymeleaf 以使用纯 html 和 InternalResourceViewResolver 制作一个更简单的 mvc 应用程序。我有一个 greeting.html 我想提供,它位于 src/main/webapp/WEB-INF。当我 运行 应用程序时,我得到
No mapping found for HTTP request with URI [/WEB-INF/greeting.html] in DispatcherServlet with name 'dispatcherServlet'
这是一个常见错误,网上有很多答案,但似乎没有任何帮助。
这是我的 Application.java
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
这是我的 GreetingController.java
@Controller
public class GreetingController {
@RequestMapping("/greeting")
public String greeting() {
return "greeting";
}
}
这是我的 MvcConfiguration.java
@Configuration
@EnableWebMvc
public class MvcConfiguration extends WebMvcConfigurerAdapter{
@Bean
public ViewResolver getViewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/");
resolver.setSuffix(".html");
return resolver;
}
}
我运行它和gradle bootRun
这是带有代码的回购协议:https://github.com/driver-pete/spring-mvc-example
这里还有一些线索:
- Thymeleaf 视图解析工作正常
- InternalResourceViewResolver 解析到正确的路径
- WEB-INF 和 greeting.html 似乎存在于 war 文件中
- 我没有 jsp 或 jstl 所以我不会像某些人建议的那样错过那些罐子
我的假设是,调度程序 servlet 以某种方式配置为在 /* 而不是 / 上服务,例如 here 和无处不在。但是我没有 web.xml 所以这些建议在这里不适用。我看到了很多如何以编程方式配置调度程序 servlet 的示例,但我想将我的应用程序保持在最低限度,并且我怀疑 spring boot 应该可以配置它,因为它可以与 thymeleaf 一起正常工作。
您只需要启用默认的 servlet,这是通过将以下内容添加到您的 MvcConfiguration
:
@Configuration
@EnableWebMvc
public class MvcConfiguration extends WebMvcConfigurerAdapter{
@Bean
public ViewResolver getViewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/");
resolver.setSuffix(".html");
return resolver;
}
@Override
public void configureDefaultServletHandling(
DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}
本质上发生的事情是 Spring 不知道如何本地处理此类内容的处理(可能是 jsp 说),并且此配置是告诉它的方式委托给容器。
经过更多调查后,我发现了一个无需添加 configureDefaultServletHandling 方法即可工作的替代解决方案。您需要将嵌入式 tomcat jsp 引擎添加到 build.gradle:
compile("org.apache.tomcat.embed:tomcat-embed-jasper")
与 configureDefaultServletHandling 方法相反,此解决方案不仅适用于普通 html,而且适用于 jsp.
所有解决方案都可以在以下位置找到:https://github.com/driver-pete/spring-mvc-example 此解决方案在 master 上可用。 Biju 的解决方案在 DefaultServletHandling_solution 分支上。
视图解析器也可以在 Spring-Boot 网络应用程序的 application.properties
文件中配置,如下所示:
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
如果您使用的是 5.0 以上的 spring,则使用 org.springframework.web.servlet.view.InternalResourceViewResolver
代替
org.springframework.web.servlet.InternalResourceViewResolver
在你的 bean 定义中