В одном из моих приложений у меня есть много конечных точек с одинаковым набором заголовков:
@RequestHeader("foo") String foo,
@RequestHeader("bar") String bar,
@RequestHeader("baz") String baz,
, и в каждом методе контроллера я создаю свой пользовательский dto на основе этих заголовков:
MyDto myDto = new MyDto(foo, bar, baz);
Чтобы избежать дублирования и добавления / удаления одного заголовка 50 раз для каждого метода, я хочу иметь что-то вроде класса-перехватчика, который примет HttpHeaders
и преобразует его MyDto
только один раз, поэтому я хочу иметь возможность замените все заголовки запросов в методах контроллера просто MyDto myDto
, созданным за кулисами.
Я пытался найти решение, но ничего не нашел.
Факт:
@PostMapping("/myEndpoint")
public MyResponse myEndpoint(@RequestHeader("foo") String foo,
@RequestHeader("bar") String bar,
@RequestHeader("baz") String baz,
@RequestBody MyRequest myRequest) {
MyDto myDto = new MyDto(foo, bar, baz);
myService.doSomething(myDto);
...
}
Ожидается:
@PostMapping("/myEndpoint")
public MyResponse myEndpoint(MyDto myDto,
@RequestBody MyRequest myRequest) {
myService.doSomething(myDto);
...
}
У меня также есть метод для этого:
public MyDto transform(HttpHeaders httpHeaders) {
String foo = getHeader(httpHeaders, "foo");
String bar = getHeader(httpHeaders, "bar");
String baz = getHeader(httpHeaders, "baz");
return new MyDto(foo, bar, baz);
}
private String getHeader(HttpHeaders httpHeaders,
String key) {
return Optional.ofNullable(httpHeaders.get(key))
.map(Collection::stream)
.orElseGet(Stream::empty)
.findFirst()
.orElse(null);
}
Но я не знаю, когда я смогу вызвать его, чтобы сделать его работоспособным при каждом запросе.