gpt4 book ai didi

java - 空请求正文未被 Spring @RequestBody @Valid 注释捕获

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:18:35 28 4
gpt4 key购买 nike

我目前在 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() 中做了一些检查,以查看数据库中是否已经存在一个项目,因为它被用作更新插入。当我访问传递给保存的项目时,我得到 NullPointerException 因为项目为空。我试过使用 @RequestBody 的“required”参数,但它只检查是否有 POST 内容。如上所述,仅当用户发布不带引号的“null”作为请求正文时,才会传递 null 项。是否有一个自动的 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 中。

@ExceptionHandler(MethodConstraintViolationException.class)

编码愉快!

关于java - 空请求正文未被 Spring @RequestBody @Valid 注释捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23301070/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com