Сконфигурируйте 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-компонента.

Другие вопросы по тегам