Spring WebFlux Functional Endpoint выбрасывает 404 вместо 415 для недопустимого типа носителя - PullRequest
0 голосов
/ 16 мая 2018

Мы используем функциональные конечные точки Spring Boot 2 (v2.0.1.RELEASE). У нас есть конечная точка, подобная этой:

private RequestPredicate getByIdPredicate() {
  return RequestPredicates.GET("/*/{id}").and(RequestPredicates.accept(MediaType.APPLICATION_JSON_UTF8));
}

При вызове API с неправильным типом носителя (например, application/invalidMediaType) конечная точка выдает 404. Я понимаю это поведение (оба предиката не совпадают). Тем не менее, я хочу, чтобы это бросить 415 Unsupported media type. Как этого добиться?

1 Ответ

0 голосов
/ 17 мая 2018

С Spring WebFlux fn, RouterFunction здесь, чтобы дать вам полный контроль над отображением запросов; точно так же контракт обработчика очень общий (принимает ServerRequest, возвращает Mono<ServerResponse>).

Все разработано, чтобы дать вам полный контроль; это связано с затратами, поскольку вещи должны быть немного более явными. В вашем случае согласование контента не выполняется для вас, и вам нужно выразить это в RequestPredicates или управлять этим поведением на уровне обработчика.

В вашем случае я вижу несколько способов справиться с этим:

  • вы можете RequestPredicate.nest() предикаты; например, вложите предикат глобального пути для конечных точек "/api/*" и получите под этим предикат accept, который проверяет правильный тип носителя (а затем вложите под него другие предикаты), и используйте специальный обработчик, который возвращает HTTP 415 для всех другие

  • вы можете сделать эту проверку непосредственно в обработчиках, проверив ServerRequest и вернув оттуда HTTP 415

Нет строгого правила, и WebFlux функционал не предоставляет для этого реестр по уважительной причине: RouterFunction - это просто функция, и рекомендуется избегать общего состояния и изменчивость.

...