当我发送restTemplate.postForEntity时,我想捕获异常
public DriverDTO create(CreateDriverForm createDriverForm) throws JsonProcessingException {
try {
...
ResponseEntity<DriverDTO> responseEntity =
restTemplate.postForEntity("http://localhost:8081/drivers", entity, DriverDTO.class);
return responseEntity.getBody();
} catch (HttpClientErrorException exception) {
ExceptionResponseObject object = objectMapper.readValue(exception.getLocalizedMessage(), ExceptionResponseObject.class);
}
}
并将exception.getLocalizedMessage((从Rest-Api:转换为我的自定义异常响应对象
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ExceptionResponseObject {
private LocalDateTime timestamp;
private int status;
private String errorName;
private String message;
}
但我得到了以下错误:
com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of
`com.example.ekrany.responses.ExceptionResponseObject` (although at least one Creator exists):
no int/Int-argument constructor/factory method to deserialize from Number value (400)
at [Source: (String)"400 : "{"timestamp":"2022-08-02T12:00:13.3734961","status":400,
"errorName":"MethodArgumentNotValidException","message":"[Email already exists]"}""; line: 1, column: 1]
我应该如何转换它?或者,当我发布任何表单并出现错误时,是否有更好的做法来处理api中的4xx状态?
编辑:我已经将方法更改为期望使用字符串的ResponseEntity
public DriverDTO create(CreateDriverForm createDriverForm) throws JsonProcessingException {
HttpHeaders httpHeaders = new HttpHeaders();
DriverRequestModel driverRequestModel = new DriverRequestModel(createDriverForm.getName(), createDriverForm.getSurname(), createDriverForm.getEmail());
HttpEntity entity = new HttpEntity(driverRequestModel, httpHeaders);
ResponseEntity<String> responseEntity =
restTemplate.postForEntity("http://localhost:8081/drivers", entity, String.class);
if (responseEntity.getStatusCode().is2xxSuccessful()){
return objectMapper.readValue(responseEntity.getBody(), DriverDTO.class);
}
else{
ExceptionResponseObject object = objectMapper.readValue(responseEntity.getBody(), ExceptionResponseObject.class);
}
}
现在我得到了:"org.springframework.web.client.HttpClientErrorException$BadRequest:400:";{"时间戳":"2022-08 02T13:24:14.9394083","状态":400,"错误名称":"MethodArgumentNotValidException","消息":"[电子邮件已存在]"}">
因为如果出现错误,它将无法转换为DriverDTO。试试这个
ResponseEntity<String> responseEntity =
restTemplate.postForEntity("http://localhost:8081/drivers", entity, String.class);
if (responseEntity.statusCode == 200){
objectMapper.readValue(responseEntity.getBody(), DriverDTO.class);
}
else{
ExceptionResponseObject object = objectMapper.readValue(responseEntity.getBody(), ExceptionResponseObject.class);
}