Я использую javax и реализацию Hibernate для проверки полезной нагрузки моего запроса.
версия - org.hibernate: hibernate-validator: 5.4.1.final
Пример Pojo :
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.io.Serializable;
public class Customer implements Serializable{
@NotNull(message="name is null")
@Size(min = 1)
public String name;
@NotNull(message="country is null")
@Size(min = 1)
public String country;
}
Пример контроллера:
@RequestMapping(value = {"/customer"}, method = RequestMethod.POST)
@ResponseBody
public Customer doAdd(@RequestBody @Valid Customer inData){
//some logic
return outData
}
Пример ввода json:
{
"country":"canada"
}
Исключение консоли:
org.springframework.web.bind.MethodArgumentNotValidException: Validation failed for argument at index 0 in method: ........ model.request.Customer,java.lang.String,java.lang.String,javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse), with 1 error(s): [Field error in object 'Customer' on field 'name': rejected value [null]; codes [NotNull.Customer.name,NotNull.name,NotNull.java.lang.String,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [Customer.name,name]; arguments []; default message [name]]; default message [name is null]]
Здесь, когда customer.name имеет значение NULL, я получаю код ответа как 422 (необработанный объект). Но я хочу вернуть 400 (плохой запрос). Как я могу переопределить код ответа здесь? Буду признателен за любую ссылку на документ.
примечание - я не хочу делать эту проверку на стороне контроллера, где я могу проверить и отправить код ответа соответствующим образом. Как этот - Как вернуть 400 http код состояния с @NotNull?
Обновление - проблема была решена -------
Для меня проблема решена. Спасибо всем за ваш ответ.
Позвольте мне объяснить, что вызвало это,
HttpRequest ----> @Valid on RequestBody ----> Javax validation on Request object-----> If any of the validation fails, **MethodArgumentNotValidException** exception is thrown.
Разработчик обязан перехватить это исключение и выдать соответствующий http-код ответа. В моем случае обработчик исключений уже был там, и он перехватывал это MethodArgumentNotValidException и возвращал HttpStatus.UNPROCESSABLE_ENTITY. Вот почему я видел код ошибки 422.
Теперь я изменил обработчик исключений, как показано ниже,
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<ErrorResource>
handleMethodArgumentNotValidException(MethodArgumentNotValidException exception, HttpServletRequest request) {
List<FieldErrorResource> fieldErrorResources = new ArrayList<>();
BindingResult bindingResult = exception.getBindingResult();
for (FieldError constraintViolation : bindingResult.getFieldErrors()) {
fieldErrorResources.add(FieldErrorResource.builder()
.field(constraintViolation.getField())
.resource(request.getContextPath())
.message(constraintViolation.getDefaultMessage()).build());
}
return responseEntityFor(HttpStatus.BAD_REQUEST,
"The content you've sent contains " + bindingResult.getErrorCount() + " validation errors.", fieldErrorResources);
}