Настройка ViewResolver с помощью Spring Загрузка и аннотации не дает Не найдено сопоставление для HTTP-запроса с ошибкой URI
Я пытаюсь создать приложение "hello world" с помощью gradle, spring boot и spring mvc с простейшим разрешением и html-представлением.
Я начал с thymeleaf spring пример загрузки, и я просто хотел удалить thymeleaf, чтобы сделать более простое приложение mvc, используя чистый html и InternalResourceViewResolver. У меня есть один 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, похоже, присутствуют в военном файле
- У меня нет jsp или jstl, поэтому я не пропускаю эти банки, поскольку некоторые могут предложить
Моя гипотеза заключается в том, что сервлет диспетчера каким-то образом настроен на работу в /* вместо/like здесь и везде. Однако у меня нет web.xml, поэтому эти рекомендации здесь не применяются. Я вижу много примеров, как настроить программный сервлет диспетчера программно, но я хочу, чтобы мое приложение было минимальным, и я подозреваю, что загрузка spring должна быть настроена на него, так как отлично работает с тимелеафом.
Ответы
Ответ 1
Вам нужно только включить сервлет по умолчанию, это делается путем добавления следующего к вашему 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 сказать), и этой конфигурации можно сказать, чтобы передать его в контейнер.
Ответ 2
После исследования больше я обнаружил альтернативное решение, которое работает без добавления метода configureDefaultServletHandling. Вам нужно добавить встроенный движок jcp tomcat для сборки .gradle:
compile("org.apache.tomcat.embed:tomcat-embed-jasper")
В отличие от метода configureDefaultServletHandling это решение работает не только с простым html, но и с jsp.
Все решения доступны по адресу: https://github.com/driver-pete/spring-mvc-example
Это решение доступно для мастера.
Решение Biju находится в ветке DefaultServletHandling_solution.