java - 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()); 在配置类中设置时不起作用?感谢您提前提供帮助。
解决方案
你可以用它@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;
}
}
推荐阅读
- flutter - 检查你的配置文件 `flutter_launcher_icons.yaml` 有一个 `flutter_icons` 部分
- android-studio - /Android Studio 模拟器通过 ADB 并提取指定应用程序的令牌
- c# - 尝试启用 Texture2D 时 OpenTK“无效枚举”
- ssh - Gitlab CI - 使用 ssh 找不到 Composer
- sql - 来自两个表和一个链接表的 SQL 查询,为表 a 的每一行返回所有表 c,其中表 b 中没有链接
- javascript - 如何在基于类的组件中进行 Expo/react-native Google 身份验证?
- javascript - Fastify 重新加载浏览器
- javascript - 如何使用 Excel JavaScript API 获取选定或活动单元格的数据透视表名称和数据透视字段名称?
- amazon-web-services - 从联合角色获取 CLI 的 AWS 凭证
- redux-toolkit - 在 createAsyncThunk 方法中覆盖对象属性