如何将getLocalizedMessage()转换为自定义异常对象-MismatchedInputException



当我发送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);
}

最新更新