如何在RestController之前拦截RequestBody并从另一个微服务中处理一些业务规则?

时间:2019-06-21 01:00:53

标签: spring-boot spring-restcontroller spring-rest

基本上,我们有一个基于Spring Boot v1.2的大型整体应用程序,我们希望通过基于Spring Boot v2.1.6的MicroService(简称BR引擎)处理一些业务规则处理。

如何截获requestBody并将其首先发送到BR引擎,然后将其发送到实际的处理程序(Monolithic Controller),或者不基于BR引擎的结果-为简单起见,假设BR引擎返回true或错误。如果为true,则继续执行实际的处理程序;如果为false,则返回异常。

但是我想使用HandlerInterceptorAdapter,不确定如何截获requestBody并将其传递给微服务-然后从结果中将其继续进行或不传递给实际的处理程序。

作为一个例子,假设我有一个到Monolithic控制器的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 requestBody并将其首先发送到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;

    }

0 个答案:

没有答案