【发布时间】:2019-02-20 01:16:32
【问题描述】:
所以首先我想不出一个更好的标题来解决这个问题,所以我愿意改变。
我正在尝试使用带有 spring boot 的 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。
如您所见,我希望roles 至少包含一项,其中没有一项为空。
但是,在测试上述代码时,如果roles 包含空值,则不会报告绑定错误。如果集合为空,它确实会报告错误。
我在想这可能是 kotlin 代码如何编译的问题,因为当 User 类是用 java 编写时,相同的代码工作得很好。像这样:
@Data // just lombok...
public class User {
@NotEmpty
private Set<@NotNull Role> roles = new HashSet<>();
}
相同的控制器,相同的测试。
检查字节码后,我注意到 kotlin 版本不包括嵌套的 @NotNull 注释(见下文)。
Java:
private Ljava/util/Set; roles
@Ljavax/validation/constraints/NotEmpty;()
@Ljavax/validation/constraints/NotNull;() : FIELD, 0;
@Ljavax/validation/constraints/NotEmpty;() : FIELD, null
科特林:
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
现在的问题是为什么?
这里是sample project,以防你想尝试一些东西。
【问题讨论】:
-
在 \@NotEmpty 之前只在课堂用户中添加 \@NotNull 并尝试
-
仍然失败,
java.lang.AssertionError: No errors for field 'roles[]' of attribute 'userDto'并且在这种情况下实际上是有意义的,因为将@NotNull添加到角色只会确保roles永远不会为空。但是我想验证roles中的项目。 -
是的,我也有同样的问题。我想我暂时必须创建自定义验证器。 twitter.com/GlowinskiRafal/status/1043183121796083718
-
@TommySchmidt 我使用您提供的所有详细信息创建了一个 Kotlin 问题:youtrack.jetbrains.com/issue/KT-27049 - 希望您不介意 :)
-
@RafalG。我一点也不中。感谢发布!
标签: java spring-boot kotlin bean-validation jsr380