【问题标题】:Custom Validation over FormDataContentDisposition while uploading image as Multipart form data将图像作为多部分表单数据上传时对 FormDataContentDisposition 进行自定义验证
【发布时间】:2020-02-04 14:30:51
【问题描述】:

我想在 Jersey 中使用多部分表单数据验证正在上传的图像的文件扩展名。
我创建了一个自定义注解ImageExtensionValidator

package io.gupshup.dashboard.annotations;

import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import java.util.regex.Pattern;

import javax.validation.Constraint;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import javax.validation.Payload;

@Retention(RUNTIME)
@Target({ FIELD, PARAMETER })
@Constraint(validatedBy = { ImageExtensionValidator.Validator.class })
public @interface ImageExtensionValidator {

    String message() default "Please Enter valid Image";

    String url() default "";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

    class Validator implements ConstraintValidator<ImageExtensionValidator, String> {

        private String constraintMessage;
        private String fileName;
        Pattern pattern = Pattern.compile("\\.(?:jpg|gif|png|jpeg|JPG|GIF|PNG|JPEG)");

        @Override
        public void initialize(ImageExtensionValidator constraintAnnotation) {
            constraintMessage = constraintAnnotation.message();
            fileName = constraintAnnotation.url();
        }

        @Override
        public boolean isValid(String value, ConstraintValidatorContext context) {

            if (value == null || value.trim().isEmpty()) {
                return true;
            } else if (pattern.matcher(value.trim()).matches()) {
                return true;
            } else {
                context.disableDefaultConstraintViolation();
                context.buildConstraintViolationWithTemplate(constraintMessage).addConstraintViolation();
                return false;
            }

        }
    }
}

并像这样使用它:

@FormDataParam("logo")
private InputStream logoStream;

@ImageExtensionValidator
@FormDataParam("logo")
private FormDataContentDisposition logoDetails;

我在使用这个时遇到以下错误:

javax.validation.UnexpectedTypeException: HV000030: No validator could be found for type: org.glassfish.jersey.media.multipart.FormDataContentDisposition.

我知道还有其他方法可以做到这一点。但是这样的事情会让我的代码更整洁。提前致谢。

【问题讨论】:

  • 您必须使用 ConstraintValidator&lt;ImageExtensionValidator, FormDataContentDisposition&gt; 并从 FDCD 获取文件名。

标签: java validation jersey jax-rs bean-validation


【解决方案1】:

在 Paul 发表评论后,我意识到我的 ImageExtensionValidator 代码中有一个错误。该类应定义为:

class Validator implements ConstraintValidator<ImageExtensionValidator,
                                               FormDataContentDisposition> {}

【讨论】:

    猜你喜欢
    • 2014-10-18
    • 2020-02-24
    • 1970-01-01
    • 1970-01-01
    • 2012-12-04
    • 1970-01-01
    • 2023-03-08
    • 2012-04-10
    • 2019-05-31
    相关资源
    最近更新 更多