首页 > 解决方案 > Spring RestTemplate:在配置类中设置时覆盖 ResponseErrorHandler 不起作用

问题描述

我有 RestTemplate ,我在下面的代码中覆盖了 ResponseErrorHandler

@Bean
public RestTemplate restTemplate() {
    RestTemplate restTemplate = new RestTemplate(new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory()));
    restTemplate.setErrorHandler(new RsponseError());
    return restTemplate;
}

我的 ResponseError 类是这样的

public class RsponseError implements ResponseErrorHandler{

@Override
public boolean hasError(ClientHttpResponse clientHttpResponse) throws IOException {
    log.info("statuscode {}",clientHttpResponse.getStatusCode());
    return true;
}

@Override
public void handleError(ClientHttpResponse clientHttpResponse) throws IOException {

    log.info("status code {}",clientHttpResponse.getStatusCode());
    log.info("status text {}",clientHttpResponse.getStatusText());

}

如果 l 自动装配 RestTemplate 并调用休息服务并生成错误,则 ResponseError 不起作用。但是,如果我没有在配置中设置错误处理程序并在像下面的类那样自动装配 RestTemplate 之后设置它,它将起作用。

@Autowired
private RestTemplate restTemplate;


@Override
public ResponseEntity<ClassExampleResponse> invoker(ClassExample classExample,
                                                                String uri) throws Exception {
        final RequestEntity<ClassExample> requestEntity = new RequestEntity<>(classExample, requestHeader(), HttpMethod.POST, new URI("https://somelink"));
        restTemplate.setErrorHandler(new RsponseError());
        final ResponseEntity<ClassExampleResponse> responseEntity = restTemplate.exchange(requestEntity, ClassExampleResponse.class);
    return responseEntity;
}

为什么是 restTemplate.setErrorHandler(new RsponseError()); 在配置类中设置时不起作用?感谢您提前提供帮助。

标签: javaspringrestspring-mvcresttemplate

解决方案


你可以用它@ControllerAdvice来让你所有的问题都消失!

这是一个简短的示例,应该可以解决您的问题。它从您的 bean 验证中获取输出并将其显示为 JSON。

你可以看看我之前的一个答案。这将涵盖其工作原理的一些细节。 带有自定义 Json 输出的 DropWizard 中的 Bean 验证

@ExceptionHandler(MethodArgumentNotValidException.class)
@Order(1)
public ResponseEntity<ValidationErrors> handleUnexpectedException(MethodArgumentNotValidException errors) {

    ValidationErrors validationErrors = new ValidationErrors();

    for (FieldError fe : errors.getBindingResult().getFieldErrors()) {

        String field = fe.getField();
        String msg = fe.getDefaultMessage();

        validationErrors.add(field, msg);
    }
    return new ResponseEntity<ValidationErrors>(validationErrors, HttpStatus.UNPROCESSABLE_ENTITY);
}

public class ValidationErrors {

    public List<ValidationObject> errors = new ArrayList<ValidationObject>();

    public void add(String field, String error){
        errors.add(new ValidationObject(field, error));
    }
}


public class ValidationObject {

    private String field, error;

    public ValidationObject(String field, String error){
        this.field = field;
        this.error = error;
    }

    public String getField() {
        return field;
    }

    public void setField(String field) {
        this.field = field;
    }

    public String getError() {
        return error;
    }

    public void setError(String error) {
        this.error = error;
    }
}

推荐阅读