所以首先我想不出这个问题的更好的标题,所以我愿意接受改变.
我正在尝试使用带有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) 这是有关方法验证的示例。因此,检查方法参数不为空,我必须编写以下内容:
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)
有任何想法吗?