java - 未触发验证检查的 Spring boot 2 rest api 客户注释
问题描述
我正在为上传图片创建一个休息 api。为了验证多部分对象,我正在创建注释。但它没有触发。还放置调试点并检查。下面是我的注释代码
import javax.validation.Constraint;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import javax.validation.Payload;
import org.springframework.web.multipart.MultipartFile;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {ValidImage.Validators.class})
public @interface ValidImage {
String message() default "Invalid image file";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
class Validators implements ConstraintValidator<ValidImage, MultipartFile> {
@Override
public boolean isValid(MultipartFile multipartFile, ConstraintValidatorContext context) {
System.out.println("Validation Called");
boolean result = true;
String contentType = multipartFile.getContentType();
if (!isSupportedContentType(contentType)) {
context.disableDefaultConstraintViolation();
context.buildConstraintViolationWithTemplate(
"Only PNG or JPG images are allowed.")
.addConstraintViolation();
result = false;
}
return result;
}
private boolean isSupportedContentType(String contentType) {
return contentType.equals("image/png")
|| contentType.equals("image/jpg")
|| contentType.equals("image/jpeg");
}
}
}
这是我的控制器映射
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
@RestController
@Validated
public class ImageStorageController {
private static final Logger logger = LoggerFactory.getLogger(ImageStorageController.class);
@Autowired
private ImageStorageService imageStorageService;
@PostMapping(value = "/images", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ResponseEntity<Object> uploadImage(@ValidImage @RequestParam("image") MultipartFile imageFile) throws IOException {
Long imageId = imageStorageService.save(imageFile);
String imageUri = ServletUriComponentsBuilder.fromCurrentContextPath().path("/images/")
.path(String.valueOf(imageId)).toUriString();
return ResponseEntity.ok().body(new UploadImageResponse(imageFile.getOriginalFilename(), imageUri, imageFile.getContentType(),
imageFile.getSize()));
}
}
我正在像这样在全局异常处理程序中处理这个验证
@Order(Ordered.HIGHEST_PRECEDENCE)
@ControllerAdvice
public class RestExceptionHandler extends ResponseEntityExceptionHandler {
@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex,
HttpHeaders headers, HttpStatus status, WebRequest request) {
final ApiError apiError = new ApiError(HttpStatus.BAD_REQUEST);
apiError.setMessage(ex.getLocalizedMessage());
apiError.addValidationErrors(ex.getBindingResult().getFieldErrors());
return buildResponseEntity(apiError);
}
我找到了几个解决方案,但它不适用于我的情况。任何解决方案帮助将不胜感激。
解决方案
推荐阅读
- angular - ngOnInit() 方法没有按预期工作
- java - 小数点分隔符在后台被删除
- mysql - Laravel MySql 获得球员参加比赛
- javascript - 无法在所有图像上设置相同的宽度和高度
- android - GTM(firebase)跟踪android中的应用程序打开事件和活动
- mysql - 来自mysql json数据的grafana时间序列图
- android - Android textview 奇怪的行为:焦点更改时自动滚动到顶部
- npm - 确保 NPM 开发依赖项匹配相应的对等依赖项
- javascript - 如何将猫鼬查询的结果保存到 javascript 变量中?
- matlab - Matlab 中不显示希腊语单词