По сути, у нас есть большое монолитное приложение, построенное на 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;
}