我有一个文件上传验证 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,这就是我想要的。
我的代码怎么了?
谢谢。
1条答案
按热度按时间pgky5nke1#
还有一个
BindException
如果从请求参数创建了无效对象,则由spring mvc抛出。MethodArgumentNotValidException
已经是的子类BindException
.这些实际上是故意不同的例外@如果不存在其他注解,则默认情况下假定modeldattribute会进行数据绑定和验证,并引发bindexception以指示绑定请求属性或验证结果值失败@另一方面,requestbody通过其他转换器转换请求体,对其进行验证,如果验证失败,则引发各种与转换相关的异常或methodargumentnotvalidexception。在大多数情况下,methodargumentnotvalidexception可以常规处理(例如通过@exceptionhandler方法),而bindexception通常在每个控制器方法中单独处理。
可以单独处理这些错误,也可以只捕获超类
BindException
.