我有简单的控制器方法,它接收文件:
@ResponseBody
public MyDto createProduct(MyDto dto, @RequestParam(value = "file") MultipartFile file) {
}
问题是如果用户没有在表单中选择文件,Spring不会抛出异常。但我需要确保用户选择了一些文件。我尝试添加required = true
,但它没有帮助(此外默认设置为true
)
实际上,只有当我的表单根本不包含名为file
的参数时,Spring才会抛出异常:
必需的MultipartFile参数' file'不存在
但是如果没有在HTML表单中选择参数present和file,那么没有例外。
如何解决这个问题?
由于
答案 0 :(得分:1)
您可以将MultipartFile file
作为DTO的媒体资源,并编写自定义验证注释,例如@FilePresent
。你的签名可能就像
public MyDto createProduct(@Validated MyDto dto, BindingResult result)
您将在 MyDto
中注释文件属性@FilePresent
private MultipartFile file;
您的自定义验证码类似于:
@FilePresent
注释
@Documented
@Retention(RUNTIME)
@Constraint(validatedBy = {FilePresentMultipartFileValidator.class})
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
public @interface FilePresent {
String message() default "{your.package.FilePresent.message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
String value() default "true";
}
自定义验证器
public class FilePresentMultipartFileValidator implements ConstraintValidator<FilePresent, MultipartFile> {
@Override
public void initialize(FilePresent constraintAnnotation) {
//NOOP
}
@Override
public boolean isValid(MultipartFile value, ConstraintValidatorContext context) {
return !(value == null || value.isEmpty());
}
}
最后一步是在类路径(和/或其本地化的等价物)上有一个ValidationMessages.properties
文件,其中包含您选择的消息值的密钥your.package.FilePresent.message