Java 使用Objects.requirennull()来验证请求体类对象。requirennull(body.getName())返回错误代码

Java 使用Objects.requirennull()来验证请求体类对象。requirennull(body.getName())返回错误代码,java,spring-boot,spring-mvc,Java,Spring Boot,Spring Mvc,当我使用Objects.requireNonNull()验证请求主体时,一些api返回错误代码400,其他api返回500。应该是400,因为发送到服务器端的正文无效。我现在很困惑,有人知道如何解决这个问题吗。谢谢 @PostMapping(value = "/referencing-courses") public Object get(@RequestBody Criteria criteria) { Objects.requireNonNull(crit

当我使用Objects.requireNonNull()验证请求主体时,一些api返回错误代码400,其他api返回500。应该是400,因为发送到服务器端的正文无效。我现在很困惑,有人知道如何解决这个问题吗。谢谢

@PostMapping(value = "/referencing-courses")
public Object get(@RequestBody Criteria criteria) {
        Objects.requireNonNull(criteria, "body is required");
        Objects.requireNonNull(criteria.getContentId(), "contentId is required.");
        Objects.requireNonNull(criteria.getSchemaVersion(), "schemaVersion is required.");
        return findLatestTreeRevisionReference.find(criteria);
    }

Objects.requireNonNull()
如果传递的参数为null,则抛出“NullPointerException”。异常会触发内部服务器错误(500)

状态代码400不是由异常引起的,而是因为默认情况下控制器参数不为null,并且spring验证了这一点

正如评论中指出的,您可以使用
@Valid

@PostMapping(value=“/referenting-courses”)
获取公共对象(@RequestBody@Valid-Criteria){
返回FindLatestTreeVisionReference.find(条件);
}
要使其起作用,
标准
需要使用适当的注释:

公共类标准{
@NotNull
私有字符串contentId;
@NotNull
私有字符串模式厌恶;
//能手/二传手
}
如果
@Valid
不可行,您还可以按照说明在控制器中创建自定义异常和/或异常处理程序

例如,您可以捕获控制器中的每个NullPointerException并发回400错误请求状态:

@ResponseStatus(HttpStatus.BAD_请求)
@ExceptionHandler(NullPointerException.class)
公共无效手册(){
//由@ResponseStatus完成
}
但是,发生NullPointerException的原因可能与用户发送无效请求的原因不同。为了绕过该问题,您可以创建自己的异常,将其转换为错误400:

@ResponseStatus(value=HttpStatus.NOT\u FOUND,reason=“请求正文无效”)
公共类InvalidBodyException扩展了RuntimeException{
//不需要额外的逻辑
}
然后,您可以创建自己的方法来执行空检查,并使用该方法代替
对象。requirennoull

public void requirennull(对象o){
如果(o==null){
抛出新的InvalidBodyException();
}
}

您了解requirennoull的工作原理吗?请改用
@Valid