标签: jsr380

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
查看次数

spring方法验证中如何验证方法参数默认为NotNull?

是有关方法验证的示例。因此,检查方法参数不为空,我必须编写以下内容:

import org.springframework.validation.annotation.Validated

@Validated
public class SomeClass {
    public void myMethod(@NotNull Object p1, @Nullable Object p2) {}
}
Run Code Online (Sandbox Code Playgroud)

有没有办法设置 spring bean 验证以使所有参数默认验证@NotNull?例如,以下操作将在p1以下情况下失败null

import org.springframework.validation.annotation.Validated

@Validated
public class SomeClass {
    public void myMethod(Object p1, @Nullable Object p2) {}
}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

java spring jsr380

5
推荐指数
1
解决办法
4424
查看次数

标签 统计

java ×2

jsr380 ×2

bean-validation ×1

kotlin ×1

spring ×1

spring-boot ×1