Как Spring MVC @PathVariable получает параметры с несколькими '/'?

Я работал над виджетом загрузки файлов для управления изображениями.

Я хочу, чтобы пути к изображениям можно было получать через @PathVariable в Spring MVC, например http://localhost:8080/show/img/20181106/sample.jpg вместо http://localhost:8080/show?imagePath=/img/20181106/sample.jpg.

Но / будет разрешен Spring MVC, и он всегда будет возвращать 404 при доступе.

Есть ли хороший способ обойти это?

вы должны использовать этот формат для RequestMappinghttp://localhost:8080/show/{imagePath:.+}

Hadi J 06.11.2018 11:10

Если в / несколько imagePath, этот формат все равно возвращает 404.

Jimmy Wang 06.11.2018 11:36
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
2
186
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете использовать, как показано ниже.

@RequestMapping(value = "/show/{path:.+}", method = RequestMethod.GET)
public File getImage(@PathVariable String path) {
        // logic goes here
}

Здесь .+ - это совпадение с регулярным выражением, оно не будет обрезать .jpg на вашем пути.

Извините за это, но я думаю, что ответ @Alien не отвечает на вопрос: он обрабатывает только случай точки . в @PathVariable, но не случай косой черты /.

Однажды у меня была проблема, и вот как я ее решил, это не очень элегантно, но все же нормально, я думаю:

private AntPathMatcher antPathMatcher = new AntPathMatcher();

@GetMapping("/show/**")
public ... image(HttpServletRequest request) {
    String uri = (String) request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE);
    String pattern = (String) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);
    String path = antPathMatcher.extractPathWithinPattern(pattern, uri);

    ...
}

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