так что в первую очередь я не мог придумать лучшего названия для этого вопроса, поэтому я открыт для изменений.
Я пытаюсь проверить компонент, используя механизм проверки компонентов (JSR-380) с загрузкой весны.
Итак, я получил контроллер вроде этого:
@Controller
@RequestMapping("/users")
class UserController {
@PostMapping
fun createUser(@Validated user: User, bindingResult: BindingResult): ModelAndView {
return ModelAndView("someview", "user", user)
}
}
с этим будет класс User, написанный в kotlin:
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[]"))
}
Недействительные роли отображаются в нуль.
Как вы можете видеть, я хочу, чтобы roles
содержали хотя бы один элемент, при этом ни один из элементов не был бы нулевым. Однако при тестировании вышеуказанного кода ошибки привязки не сообщаются, если roles
содержат нулевые значения. Он сообщает об ошибке, если набор пуст, хотя. Я думал, что это может быть проблемой с тем, как компилируется код kotlin, поскольку тот же самый код работает очень хорошо, когда класс User написан в java. Как это:
@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
Котлин:
private Ljava/util/Set; roles
@Ljavax/validation/constraints/NotEmpty;()
@Lorg/jetbrains/annotations/NotNull;() // added because roles is not nullable in kotlin
Теперь вопрос в том, почему?
Вот пример проекта, если вы хотите попробовать что-то.