Я разрабатываю REST API с использованием Spring Boot 1.5.15 . Я реализовал клиента HandlerMethodArgumentResolver
для сопоставления заголовка HTTP. Подробно присваиваю значение HTTP-заголовка Some-Header
, удаляя префикс «XXX».
Прежде всего, я определил пользовательскую аннотацию.
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface SomeHeader {
}
Затем я реализовал собственный распознаватель.
public class SomeHeaderArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.getParameterAnnotation(SomeHeader.class) != null;
}
@Override
public Object resolveArgument(MethodParameter parameter,
ModelAndViewContainer mavContainer,
NativeWebRequest webRequest,
WebDataBinderFactory binderFactory) {
HttpServletRequest request = (HttpServletRequest) webRequest.getNativeRequest();
final String headerValue = request.getHeader("Some-Header");
return headerValue.replace("XXX ", "");
}
}
И, наконец, я сообщил Spring о распознавателе в классе конфигурации.
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(new SomeHeaderArgumentResolver());
}
}
Теперь я могу использовать следующее отображение в любом контроллере, который мне нужен.
@PostMapping("/some/paath")
public void someMethod(@SomeHeader String someHeaderValue) {
// Method body...
}
Однако, Some-Header
информация для меня обязательна. Я хочу, чтобы, если это не присутствует, Spring возвращает ответ 400 Bad Request вызывающей стороне. Такое же поведение я могу получить, используя аннотацию @RequestHeader("Some-Header")
.
Могу ли я повторить то же поведение? Возможно, я не хочу использовать выделенный совет контроллера .