Как настроить мапинг запросов на ресурсы web-приложения?

Web-приложение имеет такой контроллер:
@RestController
@RequestMapping("/")
public class HttpRequestController implements ControllerConstants {

    @Autowired
    private ApplicationContext context;
    
    @Autowired
    private ApiService apiService;

    @RequestMapping(value = "/{version}/**", method = {GET, POST, PUT, DELETE})
    public Object handleHttpRequest(@PathVariable("version") String version, HttpServletRequest request) {
        final Api api = apiService.getApiByVersion(version);
        if ( api == null ) {
            throw new NotFoundException("Api with version " + version + " not founded");
        }
        //далее вызов методов api
    }

    @RequestMapping("/example/{example}.html")
    public ModelAndView getExample(@PathVariable("example") String example) {
        return new ModelAndView("example/" + example);
    }
    
}


И такой конфиг:
@Configuration
@EnableWebMvc
@ComponentScan()
public class SpringWebConfig extends WebMvcConfigurerAdapter {

  @Bean
  public InternalResourceViewResolver getInternalResourceViewResolver() {
    InternalResourceViewResolver resolver = new InternalResourceViewResolver();
    resolver.setPrefix("/WEB-INF/");
    resolver.setSuffix(".html");
    return resolver;
  }

  @Override
  public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    configurer.enable();
  }

  @Bean
  public WebContentInterceptor webContentInterceptor() {
    WebContentInterceptor interceptor = new WebContentInterceptor();
    interceptor.setCacheSeconds(0);
    interceptor.setUseExpiresHeader(true);
    interceptor.setUseCacheControlHeader(true);
    interceptor.setUseCacheControlNoStore(true);

    return interceptor;
  }

  @Override
  public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(webContentInterceptor());
  }
}


В директории WEB-INF есть директория example, в которой лежит файл some.html.

Приложение развернуто на Tomcat-е с контекстным путем /api.

Когда я оправляю запрос localhost:8080/api/v1/someMethod, то вызов правильно обрабатывается, метод вызывается и результат отправляется клиенту. Когда я отправляю запрос localhost:8080/api/example/some.html, то в ответ получаю следующую ошибку:
b923a06dbfbb48b1bc9b423aefa2f278.png.
Подскажите, как сделать так, чтобы при запросах вида localhost:8080/api/example/some.html возвращалась запрошенная страница?
  • Вопрос задан
  • 281 просмотр
Пригласить эксперта
Ответы на вопрос 1
jaxtr
@jaxtr
JavaEE/Spring-разработчик
Всё правильно, так как адрес example/some.html попадает под оба правила.
Правило /{version}/** в твоём случае перекрывает все варианты, так что самый простой способ избавиться от проблемы - сделать правило более строгим (например, /api/{version}/**).

И да, в @RestController возвращать ModelAndView из методов, ИМХО, как-то некрасиво.

UPD: методом тыка вышел на такой вариант:
@Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**.html").addResourceLocations("/WEB-INF/");
    }


Добавляешь это в SpringWebConfig, в результате чего все файлы, заканчивающиеся на .html будут искаться в /WEB-INF/. Из контроллера можешь убрать обработку .html-запросов
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы