【问题标题】:Custom Request param Validator not working in SpringBoot自定义请求参数验证在 Spring Boot 中不起作用
【发布时间】:2018-06-01 07:20:07
【问题描述】:

以下是验证文件扩展名的验证器

FileExtensionValidator.java

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

import org.springframework.web.multipart.MultipartFile;

public class FileExtensionValidator implements ConstraintValidator<ValidExtension, MultipartFile> {

    @Override
    public void initialize(ValidExtension extension) {

    }

    @Override
    public boolean isValid(MultipartFile file, ConstraintValidatorContext context) {

        String extension = "";
        if (null != file) {
            extension = file.getName();
        }

        return (null != extension) && (extension.endsWith(".png") || extension.endsWith(".PNG")
                || extension.endsWith(".JPEG") || extension.endsWith(".jpeg")) ? true : false;

    }

}

这里是验证界面 ValidExtension.java

import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import javax.validation.Constraint;
import javax.validation.Payload;

@Target({ METHOD, FIELD, ANNOTATION_TYPE, PARAMETER, TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = FileExtensionValidator.class)
@Documented
public @interface ValidExtension {

    String message() default "Not a valid Email";

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

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

这是使用的控制器

@RequestMapping(value = "/file/upload", method = POST, consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = APPLICATION_JSON_VALUE)
    public BaseResponse uploadFile(@ValidExtension @RequestParam("file") MultipartFile file) {
        return fileStorageService.upload(file);
    }

在 pom 中添加了以下内容

        <dependency>
            <groupId>commons-validator</groupId>
            <artifactId>commons-validator</artifactId>
            <version>1.5.1</version>
        </dependency>

使用的 Spring 版本:4

我确实在验证逻辑中得到了我的方法。如果我缺少任何基本步骤,请让我理解。已经检查了基本教程都说相同的步骤。

提前致谢。

【问题讨论】:

标签: java spring validation spring-boot


【解决方案1】:

这可能对最初创建此帖子的人没有帮助,但可能对像我这样面临同样问题的人有用。

那是因为您需要指定该方法将被“验证”。 为此并使其正常工作:

@Valid
@PostMapping("")
fun createStudent( @ValidStudent @RequestBody dto: StudentDTO ) =
    studentService.createStudent(dto)

然后您将在 ControllerAdvice 处理 MethodArgumentNotValidException

中管理您的异常

如果您想更好地控制异常抛出部分(我推荐),您可以选择:

@PostMapping("")
fun createStudent( @Valid @ValidStudent @RequestBody dto: StudentDTO, errors: Errors) =
    if (errors.hasErrors()) throw ResourceNotFoundException(errors.allErrors[0].defaultMessage)
        else studentService.createStudent(dto)

然后,您使用自定义验证器抛出的消息来处理您想要的异常。

这是用 Kotlin 编写的,但在纯 Java 中是完全一样的。 希望对您有所帮助。

编码愉快! :)

【讨论】:

    猜你喜欢
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    • 2021-04-16
    • 2019-02-12
    • 1970-01-01
    相关资源
    最近更新 更多