我有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());在配置类中设置时不起作用?谢谢你提前帮忙。
答案 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()被调用。