相关疑难解决方法(0)

bean验证不与kotlin一起使用(JSR 380)

所以首先我想不出这个问题的更好的标题,所以我愿意接受改变.

我正在尝试使用带有spring boot的bean验证机制(JSR-380)来验证bean.

所以我有一个像这样的控制器:

@Controller
@RequestMapping("/users")
class UserController {
    @PostMapping
    fun createUser(@Validated user: User, bindingResult: BindingResult): ModelAndView {
        return ModelAndView("someview", "user", user)
    }
}
Run Code Online (Sandbox Code Playgroud)

这是用kotlin编写的User类:

data class User(
    @field:NotEmpty
    var roles: MutableSet<@NotNull Role> = HashSet()
)
Run Code Online (Sandbox Code Playgroud)

这是测试:

@Test
internal fun shouldNotCreateNewTestWithInvalidParams() {
    mockMvc.perform(post("/users")
        .param("roles", "invalid role"))
        .andExpect(model().attributeHasFieldErrors("user",  "roles[]"))
}
Run Code Online (Sandbox Code Playgroud)

无效角色映射为null.

如您所见,我想要roles包含至少一个项目,其中没有项目为null.但是,在测试上述代码时,如果roles包含空值,则不会报告绑定错误.如果集合为空,它会报告错误.我认为这可能是kotlin代码如何编译的问题,因为当用java编写User类时,相同的代码工作得很好.像这样:

@Data // just lombok...
public class User {
    @NotEmpty
    private Set<@NotNull Role> roles = new HashSet<>();
}
Run Code Online (Sandbox Code Playgroud)

同一控制器,相同的测试.

在检查字节码后,我注意到kotlin版本不包括嵌套@NotNull注释(见下文).

Java的:

private Ljava/util/Set; roles …
Run Code Online (Sandbox Code Playgroud)

java bean-validation kotlin spring-boot jsr380

18
推荐指数
2
解决办法
2334
查看次数

标签 统计

bean-validation ×1

java ×1

jsr380 ×1

kotlin ×1

spring-boot ×1