Подтвердить что ты не робот

Настройка 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 должна быть настроена на него, так как отлично работает с тимелеафом.

4b9b3361

Ответ 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.