首页 > 解决方案 > 后映射期间的验证不会调用 ConstraintValidator 的 isValid 函数

问题描述

我已经在控制器之一中实现了后映射:

@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我的表单模型中的属性为空。由于我使用 thymeleaf 创建表单和注释以进行验证,因此我需要file在模型对象中具有适当的值。

标签: javaspringvalidationkotlinmultipartform-data

解决方案


推荐阅读