【问题标题】:How to validate only when content is filled in Spring MVC?如何仅在 Spring MVC 中填充内容时进行验证?
【发布时间】:2020-12-08 02:41:35
【问题描述】:

我有一个具有多个属性的类。 一个是月,另一个是年。 填写这些字段不是强制性的。 应接受两者都留空。 但如果只填写其中一个,则应验证它们(根据下面的@Min 和@Max),以便它是有效的月/年日期。 我如何实现该条件? 下面的代码强制要求两者都填写。不接受第一个条件(均为空)。

@Entity
public class Person implements Serializable{

    private static final long serialVersionUID = 1L;

    //Other attributes here
    
    @Min(value=1, message="Invalid month")
    @Max(value=12, message="Invalid month")
    private int month;
    
    @Min(value=1900, message="Invalid year")
    @Max(value=2100, message="Invalid year")
    private int year;

【问题讨论】:

    标签: java bean-validation


    【解决方案1】:

    JSR-303 解决了这个问题。您可以在Person.java 上创建自定义验证器注释@ValidMonthAndYear

    ValidMonthAndYear.java

    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    import javax.validation.Constraint;
    import javax.validation.Payload;
    
    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Constraint(
        validatedBy = {MonthAndYearValidator.class}
    )
    public @interface ValidMonthAndYear {
        String message() default "Missing Month or Year";
    
        Class<?>[] groups() default {};
    
        Class<? extends Payload>[] payload() default {};
    }
    

    MonthAndYearValidator.java

    import javax.validation.ConstraintValidator;
    import javax.validation.ConstraintValidatorContext;
    
    public class MonthAndYearValidator implements ConstraintValidator<ValidMonthAndYear, Person> {
    
    
        public boolean isValid(Person person, ConstraintValidatorContext context) {
            boolean isValid = false;
            //Logic here to validate Person attributes
            return isValid;
        }
    }
    

    【讨论】:

    • 感谢您的回复@Tushar。不过,这对我来说似乎有点复杂。在这种情况下更容易忘记注释,只需做一个简单的检查以查看字段是否已填充,在这种情况下,将值传递给一个简单的函数以检查值是否在范围内。有时自己做比尝试使用框架解决方案更容易。
    • 同意。仅当您在多个地方重复使用验证时才有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-15
    • 2017-08-17
    • 2012-08-22
    • 2013-06-11
    相关资源
    最近更新 更多