Kotlin上需要NotNull吗?
我有一个班级:
class User( var name: String )
并映射后的请求:
@PostMapping("/user") fun test(@Valid @RequestBody user: User) { //... }
如果客户端发送name: null
的用户的JSON,该怎么办? 会被MVC验证器拒绝还是会抛出异常? 我应该使用@NotNull
注释name
吗? 不幸的是,我不能检查,因为只能写测试(它不可用来创建User(null)
)。
由于name
是User
非空参数,因此它不能接受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:无法读取文档:实例化…
- 我不能在Springboot-Kotlin中排除MongoAutoConfiguration(MongoSocketOpenException)
- Spring Boot .mustache文件扩展名
- 在@Service中使用Kotlin的Spring Boot @Autowired始终为空
- 如何禁用RepositoryRestHandlerMapping和EndpointHandlerMapping?
- 以编程方式重新启动Spring Boot应用程序/刷新Spring上下文
- 正确的方法为不可变的构造函数注入Kotlin类
- Spring MVC应用程序中的多个ScriptTemplateViewResolvers
- kotlin和@Valid Spring注解
- 将thymeleaf版本2.14迁移到3.0不能找到消息属性