在restTemplate之后设置spring过滤器

时间:2018-02-21 12:12:23

标签: java spring rest spring-boot groovy

我有一些没有http错误代码的端点。我收到的是200OK,响应中出现消息错误。我想要做的是,在每个restTemplate GET之后,设置一些自定义逻辑来检查响应是否是错误。 到目前为止我尝试过的是实现一个使用我的端点的过滤器类

@Component
class ErrorFilter implements Filter {

   @Override
   void doFilter(ServletRequest servletRequest, ServletResponse 
servletResponse, FilterChain filterChain) {
       System.out.println("Filter called")
       filterChain.doFilter(servletRequest, servletResponse)
   }
}

当我实现端点时,这很好用,我可以在每次请求后添加逻辑。但是当我使用restTemplate调用外部端点时它不起作用:

restTemplatie.exchange(url, HttpMethod.GET, request, String.class)

所以,我想要做的是,在上面的代码之后,实现类似于此的逻辑:

if(response.body == customErrorMessage){
    thrown Exception
}

我想在每次restTemplate调用中都能使用它。我可以用弹簧靴以某种方式实现这一点吗?

可能与restTemplate拦截器类似,但是iterceptor在调用之前正在工作,之后我需要它(因为我想访问响应)

1 个答案:

答案 0 :(得分:2)

您可以使用Interceptor处理响应。在您的情况下,您可以执行以下操作:

public class ResponseInterceptor implements ClientHttpRequestInterceptor {

final static Logger log = LoggerFactory.getLogger(LoggingRequestInterceptor.class);

@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
    ClientHttpResponse response = execution.execute(request, body);
    //add your code
    if(response.getBody() == customErrorMessage){ // TODO 
      thrown new Exception("customErrorMessage");
    }
    return response;
}

要获取响应正文,您需要将其读作:

StringBuilder inputStringBuilder = new StringBuilder();
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(response.getBody(), "UTF-8"));
        String line = bufferedReader.readLine();
        while (line != null) {
            inputStringBuilder.append(line);
            inputStringBuilder.append('\n');
            line = bufferedReader.readLine();
        }

然后检查inputStringBuilder.toString()(或者您可以line检查)