Kotlin需要NotNull吗?

Fee*_*eco 4 spring-mvc bean-validation kotlin

我有一节课:

class User(

    var name: String

)
Run Code Online (Sandbox Code Playgroud)

并且映射的帖子请求:

@PostMapping("/user")
fun test(@Valid @RequestBody user: User) {
    //...
}
Run Code Online (Sandbox Code Playgroud)

如果客户端发送用户的JSON name: null怎么办?是否会被MVC Validator拒绝或抛出异常?我应该注释name@NotNull?不幸的是,我无法检查,因为只能编写测试(它不可用于创建User(null)).

vod*_*dan 5

由于name是非null参数User,因此无法接受nulls.

为了保证Kotlin编译器:

  • nullUser构造函数中插入一个检查,如果某些Java代码试图传递一个异常,则抛出异常null.

  • 注释name@NotNull为了留在的Java API一致

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

以下是相应的文档

更新

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


Jam*_*ett 5

你可以避免使用@NotNull,因为它永远不会被非可空属性触发(bean验证只有在杰克逊反序列化JSON之后才会启动 - 这就是失败的地方).

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

唯一需要注意的是,jackson-kotlin-module 第一个缺失属性失败,不像Java中的bean验证,它将返回所有违规.


Fee*_*eco 1

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

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