#java #json #spring-boot #rest #postman
Вопрос:
Рассмотрим сценарий, в котором я хочу создать запись в базе данных с уже существующим идентификатором. Делая это, мы получаем «500-внутренняя ошибка сервера». Но я хочу настроить возвращаемое сообщение на «Идентификатор уже существует, не удается создать запись». Ниже приведен мой пример существующего кода: Класс контроллера :
@PostMapping(value = "/plans")
public ResponseEntity<ResponseSave> savePostPlanDetails(
@Valid @RequestBody(required = true) Plan plan) throws ParseException {
String planId = plan.getPlanId();
Integer createdId = planDataService.savePlan(plan, planId);
ServiceMessage serviceMessage = ServiceMessage.createCreatedServiceMessage();
return new ResponseEntity<>(ResponseSave.createResponseSave(serviceMessage, createdId), HttpStatus.CREATED);
}
Класс обслуживания :
public Integer savePlan(Plan plan, String planId) throws ParseException {
PlanDao findResponse = planDataRepository.findByPlanId(planId);
if (findResponse != null) {
//This line generate 500 error if create with already existing ID.
throw new IllegalArgumentException(PlanSearchEnum.RECORD_ALREADY_EXIST.getValue());
}
PlanDao planDao1 = requestToResponseMapper.panToPlanDao(plan);
PlanDao saveResponse = planDataRepository.save(planDao1);
return saveResponse.getInternalId();
}
Выход почтальона :
{
"message": {
"code": "500",
"description": "Unable to process request",
"type": "Internal Server Error"
}
}
Как и в приведенном выше ответе почтальона, я хочу, чтобы описание было таким : «описание»: «Идентификатор уже существует, не удается создать запись» вместо общего сообщения, как показано выше. Так как же это сделать ?
Ответ №1:
Вам понадобится обработчик для исключения:
@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(value = {IllegalArgumentException.class})
public ResponseEntity<Object> handleIllegalArgumentExceptions(Exception exception, WebRequest webRequest) {
HttpStatus errorCode = HttpStatus.INTERNAL_SERVER_ERROR;
return this.handleExceptionInternal(exception, new ErrorInfo(errorCode.value(), "Id already exist, Cannot create record"), new HttpHeaders(), errorCode, webRequest);
}
}
И модель ErrorInfo
:
public class ErrorInfo {
private final int code;
private final String description;
}
Наконец, вам определенно следует подумать о создании собственного исключения вместо использования универсального IllegalArgumentException
. Вы можете создать что-то более значимое для вашего бизнес-кейса, например RecordAlreadyExistsException
.