#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