Я реализовал пост-отображение в одном из контроллеров:
@PostMapping("/management/upload/")
fun uploadMultipartFile(@FileNotEmpty @RequestParam("file") file: MultipartFile,
@Valid @ModelAttribute("form") model: FileUploadForm): ModelAndView {
print("POST::RECEIVED")
return ModelAndView("management/upload", "form", FileUploadForm())
}
К сожалению, запрос получен без вызова функции isValid()
, которую я реализовал в валидаторе ниже. Я пробовал много перестановок (@FileNotEmpty, @RequestParam(...), @Valid
), но ни одна не работала. Я понятия не имею, почему эта проверка не вызывается, хотя она помечена этой аннотацией.
Вот класс формы:
data class FileUploadForm(
@FileNotEmpty
val file: MultipartFile? = null
)
Аннотация проверки:
@Constraint(validatedBy = [FileNotEmptyValidatorForMultipartFile::class])
@Target(AnnotationTarget.FIELD,
AnnotationTarget.FUNCTION,
AnnotationTarget.FILE,
AnnotationTarget.PROPERTY,
AnnotationTarget.ANNOTATION_CLASS,
AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.VALUE_PARAMETER)
@Retention(AnnotationRetention.RUNTIME)
annotation class FileNotEmpty (
val message: String = "{javax.validation.constraints.NotBlank.message}",
val groups: Array<KClass<out Any>> = [],
val payload: Array<KClass<out Any>> = []
)
Наконец, валидатор:
class FileNotEmptyValidatorForMultipartFile : ConstraintValidator<FileNotEmpty, MultipartFile> {
override fun isValid(value: MultipartFile?, context: ConstraintValidatorContext?): Boolean {
if (value == null) {
return false
}
return !value.isEmpty || value.name.isNotEmpty()
}
}
РЕДАКТИРОВАТЬ:
@RequestParam("file")
предоставляет мне правильное значение, но в то же время file
свойство в моей модели формы является нулевым. Поскольку я использую тимили для создания форм и аннотаций для проверки, мне нужно иметь правильное значение file
внутри моего объекта модели.