Spring Controller не принимает URL, который заканчивается на .uri - PullRequest
0 голосов
/ 21 марта 2019

Я определил приведенный ниже контроллер

@Controller

открытый класс HelloController {

@RequestMapping(value = "/config/{name:.*}", produces = MediaType.TEXT_PLAIN_VALUE, method = RequestMethod.GET)
@ResponseBody
ResponseEntity<String> getValue(@PathVariable String name) {
    String value = "Hello World";
    return new ResponseEntity<String>(HttpStatus.OK);
}

}

при пинге URL-адреса из браузера, например: http://localhost:8080/example/config/test.abc

Запрос работает нормально.

Но когда я пингую с URL http://localhost:8080/example/config/test.uri

, он просто переворачивает страницу с ошибкой: The resource identified by this request is only capable of generating responses with characteristics not acceptable according to the request "accept" headers.

Я попробовал MessageConverters и настроитьContentNegotiation, кажется, ничего не работает.Мне интересно, рассматривает ли Spring test.uri как недопустимые шаблоны или зарезервированные ключевые слова.

Среды, которые я пробовал.Весна 4 / Tomcat 7 & 8 Весна 5 / Tomcat 9

Ответы [ 3 ]

2 голосов
/ 21 марта 2019

попробуйте другое регулярное выражение.

вместо

.*

, что означает: различное количество любых символов, кроме новой строки

попробуй

[a-z]*\.[a-z]*

что означает различное число a-z + точка + различное число a-z

если это то, что вы хотите.

если вам не нужен шаблон, просто используйте

{name}

заказ

https://www.logicbig.com/tutorials/spring-framework/spring-web-mvc/uri-pattern.html

и

https://regexr.com/

Но я бы подумал, не могли бы вы настроить свой API следующим образом:

@RequestMapping(value = "/config/{name}/{type}", ...

Я думаю, что не стоит ожидать точек в вашем URI. Точки означают, что вы запрашиваете файл.

Оформление заказа:

Spring MVC @PathVariable с точкой (.) Усекается

0 голосов
/ 22 марта 2019

Я наконец смог решить проблему, используя ContentNegotiationConfigurer и установив тип контента для URI.

    @Override
public void configureContentNegotiation(ContentNegotiationConfigurer contentNegotiationConfigurer) {
    contentNegotiationConfigurer.mediaType("uri", MediaType.TEXT_PLAIN);
}
0 голосов
/ 21 марта 2019

Spring считает, что все, что стоит за последней точкой, является расширением файла

Чтобы преодолеть это

, измените наше определение @PathVariable, добавив сопоставление регулярных выражений

@RequestMapping(value = "/config/{name:.+}"

Ибезопасное предположение:

.abc - это не тип расширения, а .uri - это одно расширение, поэтому, возможно, именно поэтому ваш первый URL работает,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...