多部分文件自定义注解验证

8fsztsew  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(380)

我有一个文件上传验证 BindException 而不是 MethodArgumentNotValidException 我不明白为什么。

org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors
Field error in object 'patientProfileImageDTO' on field 'profileImage': rejected value [org.springframework.web.multipart.commons.CommonsMultipartFile@2840a305]; codes [CheckImageFormat.patientProfileImageDTO.profileImage,CheckImageFormat.profileImage,CheckImageFormat.org.springframework.web.multipart.MultipartFile,CheckImageFormat]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [patientProfileImageDTO.profileImage,profileImage]; arguments []; default message [profileImage]]; default message [Invalid image format (allowed: png, jpg, jpeg)]

我的控制器是:

@PostMapping("/patient/image")
public ResponseEntity<?> updateProfileImage(@Validated PatientProfileImageDTO patientProfileImageDTO)

这是病人档案

public class PatientProfileImageDTO {

    @CheckImageFormat   
    @CheckImageSize
    private MultipartFile profileImage;

    public MultipartFile getProfileImage() {
        return profileImage;
    }

    public void setProfileImage(MultipartFile profileImage) {
        this.profileImage = profileImage;
    }

}

这个 CheckFormatImage 以及 CheckImageSize 验证程序被正确调用。
我需要在我的工作中抓住这些错误:

@ControllerAdvice
public class ApiExceptionHandler {

        ExceptionHandler(MethodArgumentNotValidException.class)
        protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, WebRequest request) {

        ...
        }
    }

我在代码的另一部分中有其他自定义的验证注解,它们按预期工作。
我是说:

@OldPasswordMatch(message = "old password mismatch")
private String oldPassword;

此自定义验证会触发methodargumentnotvalidexception,这就是我想要的。
我的代码怎么了?
谢谢。

pgky5nke

pgky5nke1#

还有一个 BindException 如果从请求参数创建了无效对象,则由spring mvc抛出。 MethodArgumentNotValidException 已经是的子类 BindException .
这些实际上是故意不同的例外@如果不存在其他注解,则默认情况下假定modeldattribute会进行数据绑定和验证,并引发bindexception以指示绑定请求属性或验证结果值失败@另一方面,requestbody通过其他转换器转换请求体,对其进行验证,如果验证失败,则引发各种与转换相关的异常或methodargumentnotvalidexception。在大多数情况下,methodargumentnotvalidexception可以常规处理(例如通过@exceptionhandler方法),而bindexception通常在每个控制器方法中单独处理。
可以单独处理这些错误,也可以只捕获超类 BindException .

@ExceptionHandler(BindException.class)
protected ResponseEntity<Object> handleBindException(BindException ex) {
    // ..
}

相关问题