Java 使用Objects.requirennull()来验证请求体类对象。requirennull(body.getName())返回错误代码
当我使用Objects.requireNonNull()验证请求主体时,一些api返回错误代码400,其他api返回500。应该是400,因为发送到服务器端的正文无效。我现在很困惑,有人知道如何解决这个问题吗。谢谢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
@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
。