Сообщение об ошибке настройки неполного объекта, переданного через почтальона

#java #spring-boot #postman

Вопрос:

Предположим, я отправляю полный объект JSON в Postman, как показано ниже, для конечной точки POST:

 {
"student": [
    {
        "studentId" : "1234",
        "feesPayment" : {
            "amount" : 500.0,
            "code" : "INR"
        }
    },
    {
        "studentId" : "5678",
        "feesPayment" : {
            "amount" : 500.0,
            "code" : "INR"
        }
    }
]
 

}

тогда код состояния 200 ОК

Но теперь я отправляю тот же объект JSON, но с некоторыми изменениями в объекте, как показано ниже, для той же конечной точки: (просто удаляю объект «Оплата»)

 {
    "student": [
        {
            "studentId" : "1234"
        },
        {
            "studentId" : "5678"
        }
    ]
}
 

тогда код состояния-500 Внутренняя ошибка сервера по очевидным причинам, и ошибка выглядит следующим образом:

 {
    "timestamp" : "2021-09-02T17:07:31",
    "status" : 500,
    "error" : "Internal Server Error",
    "message" : "Internal Server Error"
}
 

Для этого кода состояния 500 сообщение об ошибке «Внутренняя ошибка сервера».
Поэтому мой вопрос в том, как я могу установить это сообщение об ошибке на что-то другое, например «Сведения об оплате сборов отсутствуют», вместо сообщения об ошибке внутреннего сервера по умолчанию?

Подход/код на Java и SpringBoot приветствуется.

Ответ №1:

Пожалуйста, изучите

 <dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-validation</artifactId> 
</dependency>
 

В своем Student классе вы можете написать что-то вроде:

 public class Student {
   @NotNull(message = "Error-2596-Fees Payment is required")
   private FeesPayment feesPayment;
}
 

В RestController вы отправите Student полезную нагрузку с @Valid аннотацией

   public ResponseEntity<String> sendStudent(@Valid Student studentToSend) { }
 

Сообщения должны быть постоянными. Если вы посмотрите на код аннотации, вы увидите, что он гласит:

 javax.validation.constraints.NotBlank.message
 

В качестве значения по умолчанию. Вы можете поддержать интернационализацию и создать файл свойств языка, а затем определить его следующим образом:

 javax.validation.constraints.NotBlank.message = "Payment is required" 
 

Еще одна вещь, которую следует учитывать, возможно, вы хотите объединить много ошибок и вернуть их пользователю сразу.

Для такого случая загляните в ExceptionHandler :

 @RestControllerAdvice
public class ExceptionHandler extends ResponseEntityExceptionHandler{

    @Override
    protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex,
                                                                  HttpHeaders headers, HttpStatus status, WebRequest request) {
        Map<String, Object> responseBody = new LinkedHashMap<>();

        List<String> allErrors = new ArrayList<>();
        ex.getBindingResult().getAllErrors().forEach(error -> allErrors.add(error.getDefaultMessage()));
        responseBody.put("Errors:", allErrors);

        return new ResponseEntity<>(responseBody, headers, status);
    }
}
 

Комментарии:

1. Есть ли какой-либо способ сделать это с помощью перечисления, например, создать наш собственный код ошибки, что-то вроде «Ошибка-2596-Требуется оплата сборов»?

2. обновлено @Arindam