Java 在REST模板之后设置弹簧过滤器

Java 在REST模板之后设置弹簧过滤器,java,spring,rest,spring-boot,groovy,Java,Spring,Rest,Spring Boot,Groovy,我有几个端点没有http错误代码。我收到的是200OK,响应上有一条错误消息。我想做的是,在每次获取restTemplate后,设置一些自定义逻辑来检查响应是否为错误。 到目前为止,我所尝试的是实现一个过滤器类,它与我的端点一起工作 @Component class ErrorFilter implements Filter { @Override void doFilter(ServletRequest servletRequest, ServletResponse servl

我有几个端点没有http错误代码。我收到的是200OK,响应上有一条错误消息。我想做的是,在每次获取restTemplate后,设置一些自定义逻辑来检查响应是否为错误。 到目前为止,我所尝试的是实现一个过滤器类,它与我的端点一起工作

@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调用中都能使用它。我能用spring boot实现这一点吗


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

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

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()
(或者您可以通过
行检查

我已经尝试过了,但是响应对象有响应头,但没有反响应体(或者我看不到),我需要检查响应体消息。添加到响应体感谢您的朋友,这工作非常好=)