Spring RestTemplate:在Configuration类中设置时,覆盖ResponseErrorHandler无法正常工作

时间:2018-05-04 18:37:19

标签: java spring rest spring-mvc resttemplate

我有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并调用rest服务并且生成错误,则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());在配置类中设置时不起作用?谢谢你提前帮忙。

2 个答案:

答案 0 :(得分:0)

您可以使用@ControllerAdvice让所有问题都消失!

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

您可以查看我以前的一个答案。这将涵盖一些细节如何工作。 Bean validation in DropWizard with custom Json output

@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;
    }
}

答案 1 :(得分:0)

我相信RestTemplate bean的ErrorHandler是在生成RestTemplate bean之后从其他地方设置的,因此您在调用resttemplate时必须强行重写ErrorHandler。

请检查所有自动装配RestTemplate的地方,然后查看restTemplate。 setErrorHandler()被调用。