Bean 验证不适用于 kotlin (JSR 380)
所以首先,我想不出这个问题的更好标题,所以我对改变持开放态度。
我正在尝试使用带有弹簧引导的bean验证机制(JSR-380)来验证bean。
所以我得到了一个这样的控制器:
@Controller
@RequestMapping("/users")
class UserController {
@PostMapping
fun createUser(@Valid user: User, bindingResult: BindingResult): ModelAndView {
return ModelAndView("someview", "user", user)
}
}
这是用 kotlin 编写的 User 类:
data class User(
@field:NotEmpty
var roles: MutableSet<@NotNull Role> = HashSet()
)
这是测试:
@Test
internal fun shouldNotCreateNewTestWithInvalidParams() {
mockMvc.perform(post("/users")
.param("roles", "invalid role"))
.andExpect(model().attributeHasFieldErrors("user", "roles[]"))
}
无效角色将映射到 null。
如您所见,我想包含至少一个项目,其中没有一个项目为空。但是,在测试上述代码时,如果包含 null 值,则不会报告绑定错误。但是,如果集合为空,则它确实会报告错误。我在想,这可能是kotlin代码如何编译的问题,因为当User类用java编写时,相同的代码工作得很好。喜欢这个:roles
roles
@Data // just lombok...
public class User {
@NotEmpty
private Set<@NotNull Role> roles = new HashSet<>();
}
相同的控制器,相同的测试。
检查字节码后,我注意到kotlin版本不包括嵌套注释(见下文)。@NotNull
爪哇岛:
private Ljava/util/Set; roles
@Ljavax/validation/constraints/NotEmpty;()
@Ljavax/validation/constraints/NotNull;() : FIELD, 0;
@Ljavax/validation/constraints/NotEmpty;() : FIELD, null
Kotlin:
private Ljava/util/Set; roles
@Ljavax/validation/constraints/NotEmpty;()
@Lorg/jetbrains/annotations/NotNull;() // added because roles is not nullable in kotlin. this does not affect validation
现在的问题是为什么?
这里有一个示例项目,以防你想尝试一些东西。