Как создать перехватчик для преобразования заголовков http в пользовательский dto? - PullRequest
1 голос
/ 08 апреля 2020

В одном из моих приложений у меня есть много конечных точек с одинаковым набором заголовков:

@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);
}

Но я не знаю, когда я смогу вызвать его, чтобы сделать его работоспособным при каждом запросе.

1 Ответ

1 голос
/ 09 апреля 2020

Я собирался сказать, написать и зарегистрировать custom HandlerInterceptor. Это позволит вам получить доступ к заголовкам, но проблема в том, что вы не получите доступ к преобразованному объекту @RequestBody - по крайней мере, насколько я знаю. Я не думаю, что это легко сделать.

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