Тело нулевого запроса не попадает в Spring @RequestBody @Valid аннотации

в настоящее время я сталкиваюсь с проблемой с @RequestBody аннотация весной. В настоящее время все мои аннотации проверки настроены на моих моделях правильно, и они отлично работают при публикации объекта. Все работает так, как ожидалось, даже когда тело запроса опубликовано полностью пустым или пустым объектом "{}". Проблема возникает, когда кто-то пытается опубликовать тело запроса "null". Это как-то проходит через @Valid аннотация и не поймана, вызывая NullPointerException когда я пытаюсь доступ к объекту. Я вставил фрагмент моего контроллера ниже.

@Secured({ ROLE_ADMIN })
@RequestMapping(method = RequestMethod.POST, consumes = { MediaType.APPLICATION_JSON_VALUE } )
public HttpEntity<Resource<Item>> addItem(@RequestBody @Valid Item item) throws Exception {
    Resource<Item> itemResource = this.itemResourceAssembler.toResource(this.itemService.save(item));
    return new ResponseEntity<Resource<Item>>(itemResource, HttpStatus.CREATED);
}

я делаю некоторые проверки в itemService.save() чтобы увидеть, существует ли элемент в базе данных уже, так как это используется как upsert. Когда я получаю доступ к элементу, переданному для сохранения, я получаю NullPointerException потому что элемент равен null. Я попытался использовать параметр "required"@RequestBody но это только проверяет, было ли что-то опубликовано. Как указано выше, элемент null передается только тогда, когда пользователь публикует "null" без кавычки в качестве тела запроса. Есть ли автоматическая аннотация Spring или конфигурация, чтобы остановить передачу этого null, или я должен просто поставить if(item == null) throw new Exception(); во всех моих контроллерах, где это может возникнуть?

3 ответов


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

@Validated
public interface ItemService {

public Item save(@NotNull Item item);

Если вы используете XML-конфигурацию spring, добавьте это в контекст xml вашего приложения.

<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
<bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor"/>

будет создано исключение MethodConstraintViolationException, которое может быть поймано в @ControllerAdvice, если вы это определили.

@ExceptionHandler(MethodConstraintViolationException.class)

Удачи В Кодировании!


по словам спецификация JSON-формате, null является допустимым значением. Джексон, который Весна использует за кулисами, десериализует a null значение JSON для Java null ссылка.

вам придется сделать то, что вы описали, и проверить это в своем контроллере. Кроме того, вы можете создать свой собственный HandlerMethodArgumentResolver чтобы сделать это для вас.


скажем так: если объект не существует, то он не может быть недействительным.

@Valid только заставляет Spring проверять, если item объект соответствует некоторым правилам. Он не проверяет, там ли он. Если тело запроса пустое или пустой объект, то процесс останавливается до проверка. Для установки по умолчанию Spring и Jackson эти два случая не допускаются.

таким образом, вы можете либо проверить значение null, либо написать расширение, как @Sotirios Делиманолис указал.