Проблема, с которой вы столкнулись, связана с тем, что spring интерпретирует last часть uri после точка (.) как расширение файла как .json или .xml. Поэтому, когда spring пытается разрешить переменную path, она просто обрезает остальные данные после того, как встретит точку (.) В конце URI.
Примечание: также это происходит, только если вы сохраняете переменную пути в конце URI.
Например, рассмотрим uri: https://localhost/example/gallery.df/link.ar
@RestController
public class CustomController {
@GetMapping("/example/{firstValue}/{secondValue}")
public void example(@PathVariable("firstValue") String firstValue,
@PathVariable("secondValue") String secondValue) {
// ...
}
}
В приведенном выше URL firstValue = "gallery.df" и secondValue = "link", последний бит после. обрезается при интерпретации переменной пути.
Итак, для предотвращения этого есть два возможных пути:
1.) Использование сопоставления регулярных выражений
Используйте регулярное выражение в конечной части отображения
@GetMapping("/example/{firstValue}/{secondValue:.+}")
public void example(
@PathVariable("firstValue") String firstValue,
@PathVariable("secondValue") String secondValue) {
//...
}
Используя +, мы указываем любое значение после того, как точка также будет частью переменной пути.
2.) Добавление косой черты в конце нашего @ PathVariable
@GetMapping("/example/{firstValue}/{secondValue}/")
public void example(
@PathVariable("firstValue") String firstValue,
@PathVariable("secondValue") String secondValue) {
//...
}
Это будет заключать нашу вторую переменную, защищая ее от поведения Spring по умолчанию.
3) Переопределив стандартную конфигурацию webmvc в Spring
Spring предоставляет способы переопределения конфигураций по умолчанию, импортируемых с помощью аннотаций @EnableWebMvc. Мы можем настроить конфигурацию Spring MVC, объявив нашу собственную DefaultAnnotationHandlerMapping bean в контексте приложения и для его свойства useDefaultSuffixPattern установлено значение false.
Пример:
@Configuration
public class CustomWebConfiguration extends WebMvcConfigurationSupport {
@Bean
public RequestMappingHandlerMapping
requestMappingHandlerMapping() {
RequestMappingHandlerMapping handlerMapping
= super.requestMappingHandlerMapping();
handlerMapping.setUseSuffixPatternMatch(false);
return handlerMapping;
}
}
Имейте в виду, что переопределение этой конфигурации по умолчанию влияет на все URL.
Примечание: здесь мы расширяем класс WebMvcConfigurationSupport для переопределения методов по умолчанию. Есть еще один способ переопределить конфигурации по умолчанию, реализуя интерфейс WebMvcConfigurer.
Подробнее об этом читайте: https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/servlet/config/annotation/EnableWebMvc.html