Kotlin上需要NotNull吗?

我有一个班级:

class User( var name: String ) 

并映射后的请求:

 @PostMapping("/user") fun test(@Valid @RequestBody user: User) { //... } 

如果客户端发送name: null的用户的JSON,该怎么办? 会被MVC验证器拒绝还是会抛出异常? 我应该使用@NotNull注释name吗? 不幸的是,我不能检查,因为只能写测试(它不可用来创建User(null) )。

由于nameUser非空参数,因此它不能接受null

为了保证Kotlin编译器:

  • User构造函数中插入一个null检查,如果某个Java代码尝试传递一个null则会引发异常。

  • 使用@NotNull注释name ,以便与Java API保持一致

  • 不添加任何@NotNull注释,因为没有一个每个人都同意:(

这里是相应的文档

更新

我已经重新检查过了,Kotlin编译器v1.0.6 确实org.jetbrains.annotations插入@Nullable@NotNull 。 我已经相应地更新了答案。

你可以避免使用@NotNull ,因为它永远不会触发非空属性(只有当Jackson反序列化JSON之后,bean验证才会被触发)。

假设你正在使用jackson-module-kotlin ,那么你应该得到一个以MissingKotlinParameterException为异常的异常,然后你可以在@ControllerAdvice处理这个异常。 在您的建议中,您可以处理正常的bean验证异常(例如,由@Size引起的@Size )和缺少非null构造函数参数( MissingKotlinParameterException )并返回指示错误字段的API响应。

唯一需要注意的是, jackson-kotlin-module 在第一个缺失的属性上失败了 ,与Java中的bean验证不同,后者将返回所有违规。

正如我所测试的,@ @NotNull根本不影响MVC验证。 您将只在控制台收到WARN消息,这是正常的:

无法读取HTTP消息:org.springframework.http.converter.HttpMessageNotReadableException:无法读取文档:实例化…