spring - 如何处理 RestTemplate 中的响应代码而不捕获异常?[弹簧靴]
问题描述
我正在向另一个 Web 服务发送响应以创建用户。如果用户已经存在,它会发回 409 响应。我正在使用 RestTemplate 像这样:
@PostMapping("/todos/{toDoNoteId}/users")
public ResponseEntity <String> postUser(@RequestBody User user, @PathVariable int toDoNoteId, UriComponentsBuilder builder)throws HttpMessageNotReadableException, ParseException{
RestTemplate restTemplate = new RestTemplate();
final String uri = "http://friend:5000/users";
try {
ResponseEntity<String> result = restTemplate.postForEntity(uri, user, String.class);
return result;
}
catch (HttpClientErrorException ex) {
return ResponseEntity.status(ex.getRawStatusCode()).headers(ex.getResponseHeaders())
.body(ex.getResponseBodyAsString());
}
}
虽然捕获异常有些工作(在 catch 块中我可以访问状态代码和正文),但有没有一种方法可以在没有异常的情况下访问它,类似于以下内容:
@PostMapping("/todos/{toDoNoteId}/users")
public ResponseEntity <String> postUser(@RequestBody User user, @PathVariable int toDoNoteId, UriComponentsBuilder builder)throws HttpMessageNotReadableException, ParseException{
RestTemplate restTemplate = new RestTemplate();
final String uri = "http://friend:5000/users";
ResponseEntity<String> result = restTemplate.postForEntity(uri, user, String.class);
if(result.getStatusCode()=="409"){
// do something
}
else{
// do something else
}
return result;
}
解决方案
您可以创建自己的自定义 resttemplate 并定义异常处理程序。这是一个代码片段。
@Configuration
public class CustomRestTemplate extends RestTemplate {
@Autowired
private CustomErrorHandler customErrorHandler;
@PostConstruct
public void init() {
this.setErrorHandler(customErrorHandler);
}
}
@Component
public class CustomErrorHandler implements ResponseErrorHandler {
@Override
public boolean hasError(ClientHttpResponse response) throws IOException {
if(response.getStatusCode() != "409"){
return true;
}else {
return false;
}
}
@Override
public void handleError(ClientHttpResponse response) throws IOException {
String responseBody = response.getBody();//Pls read from InputStream and create write into String
JSONObject jsonObj = new JSONObject(result);
JSONArray jsonArray = new JSONArray();
jsonObj.put("status", response.getStatusCode());
jsonObj.put("body", responseBody );
jsonArray.put(jsonObj);
responseString = jsonArray.get(0).toString();
throw new MyException(responseString );
}
}
class MyException throw RuntimeException {
public MyException (String message) {
super(message);
}
}
因此,您的课程将更改为
@PostMapping("/todos/{toDoNoteId}/users")
public ResponseEntity <String> postUser(@RequestBody User user, @PathVariable int toDoNoteId, UriComponentsBuilder builder)throws HttpMessageNotReadableException, ParseException{
CustomRestTemplate restTemplate = new CustomRestTemplate ();
final String uri = "http://friend:5000/users";
ResponseEntity<String> result = restTemplate.postForEntity(uri, user, String.class);
return result
}
推荐阅读
- javascript - 你能发现这个 node.js 函数中的内存泄漏吗?
- python - spark中的高效对称计算
- python-3.x - kerastuner INFO:tensorflow:Oracle 触发退出
- c# - 在启动时运行 c# 程序
- python - GCP 函数缺少属性,将 PDF 转换为 MP3
- java - Compass + MongoDB:如何为特定数据库创建用户名和密码?
- angular - 需要帮助来重构 Angular 中的异步管道
- laravel - 如何在 GCP Standard App Engine 上部署 laravel websocket?
- inheritance - Mapstruct如何从组合映射到继承?
- dns - DNS 数据包(标头、请求、响应)如何解析