首页 > 解决方案 > 未触发验证检查的 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);
    }

我找到了几个解决方案,但它不适用于我的情况。任何解决方案帮助将不胜感激。

标签: javaspring-bootvalidationspring-rest

解决方案


推荐阅读