Сконфигурируйте ViewResolver с Spring Boot и аннотации не дают сопоставления для HTTP-запроса с ошибкой URI
Я пытаюсь сделать приложение "hello world" с помощью gradle, spring boot и spring mvc с простейшим распознавателем представлений и html.
Я начал с примера весенней загрузки тимилифа и просто хотел удалить тимилеф, чтобы сделать более простое приложение mvc, используя чистый html и InternalResourceViewResolver. У меня есть один файл reeting.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 разрешает правильный путь
- Кажется, в файле war присутствуют WEB-INF и welcome.html.
- У меня нет jsp или jstl, поэтому я не скучаю по этим банкам, как некоторые могут предложить
Моя гипотеза заключается в том, что диспетчерский сервлет каким-то образом настроен для обслуживания на /* вместо / как здесь и везде. Однако у меня нет web.xml, поэтому эти советы здесь не применяются. Я вижу много примеров того, как программно настроить диспетчерский сервлет, но я хочу, чтобы мое приложение было минимальным, и я подозреваю, что весенняя загрузка должна настроить его нормально, поскольку он отлично работает с тимилифом.
4 ответа
Вам нужно только включить сервлет по умолчанию, это делается путем добавления следующего к вашему 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), и для этой конфигурации это способ сказать ему делегировать его контейнеру.
Разрешение просмотра также можно настроить в application.properties
файл веб-приложений Spring-Boot, что-то вроде ниже:
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.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 выше 5.0, используйте org.springframework.web.servlet.view.InternalResourceViewResolver вместо org.springframework.web.servlet.InternalResourceViewResolver в своем определении bean-компонента.