Как настроить сообщение об ошибке внутреннего сервера (код ошибки : 500)

#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 .