我目前在Spring中遇到@RequestBody
批注的问题。我目前在模型上正确设置了所有验证批注,并且在发布对象时它们可以很好地工作。即使发布的请求正文完全为空或为空对象“{}”,一切也按预期工作。当有人尝试发布“null”的请求正文时,就会出现问题。这会以某种方式通过@Valid
批注获得并且未被捕获,从而在我尝试访问该对象时导致了NullPointerException
。我在下面粘贴了我的 Controller 的片段。
@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
,因为项目为空。我试过使用@RequestBody
的“required”参数,但这仅检查是否有张贴的东西。如上所述,仅当用户发布不带引号的“空”作为请求正文时,才传递空项目。是否有自动的Spring批注或配置来阻止传递此null,还是应该将if(item == null) throw new Exception();
放入所有可能出现的我的 Controller 中? 最佳答案
通过发布的代码片段的外观,您可以清楚地定义服务层。我建议您在服务中使用方法级别验证,如下所示
@Validated
public interface ItemService {
public Item save(@NotNull Item item);
如果您使用spring的XML配置,请将其添加到应用的上下文xml。
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
<bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor"/>
如果定义了MethodConstraintViolationException,则可能引发@ControllerAdvice中捕获的MethodConstraintViolationException。
@ExceptionHandler(MethodConstraintViolationException.class)
祝您编码愉快!