Как перехватить RequestBody перед RestController и выполнить обработку некоторых бизнес-правил из другого микросервиса? - PullRequest
0 голосов
/ 21 июня 2019

По сути, у нас есть большое монолитное приложение, построенное на Spring Boot v1.2, и мы хотим обработать некоторые бизнес-правила из MicroService (назовем его BR-механизмом), построенного на Spring Boot v2.1.6.

Как я могу перехватить requestBody и отправить его сначала в механизм BR, а затем, когда он будет выполнен, он либо перейдет к фактическому обработчику (монолитному контроллеру), либо не будет основан на результатах механизма BR - для простоты, скажем, механизм BR возвращает либо true или ложь Если значение равно true, перейти к фактическому обработчику, если значение false, вернуть исключение.

Однако я хотел использовать HandlerInterceptorAdapter, но не уверен, как я могу перехватить requestBody и передать его микросервису - тогда по результатам он либо перейдет, либо не перейдет к фактическому обработчику.

В качестве примера, скажем, у меня есть POST-сопоставление с монолитным контроллером:

@PostMapping("/save")
public ResponseEntity<Client> save(@RequestBody ClientDTO dto) {

    log.debug("Saving...");

    Client newClient = Client.builder().build();
    BeanUtils.copyProperties(dto, newClient);

    return new ResponseEntity<>(clientService.save(newClient), HttpStatus.OK);

}

Теперь я хотел перехватить тело запроса ClientDTO и сначала отправить его в движок BR, а затем сделать кое-что оттуда. Я подумал об использовании перехватчика и добавить его в мою конфигурацию, которая реализует WebMvcConfigurer. Однако я не уверен, как можно выполнить restTemplate здесь и получить ответ от механизма BR прохождения или сбоя - в случае сбоя фактический обработчик будет пропущен и просто выдаст исключение

@Component
public class RuleEngineInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {

            // intercept requestBody then send it to BR engine
            // but how? and how can I get the response from BR engine
            // to decide whether it will proceed to actual handler 
            // or not - probably return an exception.
        return true;

    }
...