簡體   English   中英

如何在非必填字段JSR 303上使用@Pattern

[英]How to use @Pattern on non-mandatory fields JSR 303

如何在非強制表單字段上使用@Pattern約束?

@Pattern(regexp="...")
private String something;

一旦我提交表單,我就會得到預期的驗證錯誤,但是用戶可能會將該字段留空,因為這不是必填字段。

PS:我可以編寫自己的約束注釋。 但是,我只想問一種更簡單的方法來組合注釋或添加注釋屬性。 JSR303實現是hibernate-validator。

只需將其設置為null而不是空字符串。 由於空HTML輸入字段默認提交為空字符串作為HTTP請求參數,因此您需要讓MVC框架將空提交值解釋為null 這在JSF中很容易通過web.xml<context-param>完成。 但是,既然你正在使用Spring MVC並且我沒有這樣做,我在這里搜索了一下,發現這個答案可能有用。

解決此問題的另一種方法是允許空字符串作為正則表達式中的備用有效值(使用“|”)。

正如BalusC在JSF 2中所說,可以將空字符串自動轉換為null。 要使用的上下文參數是“javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL”,必須將其設置為“true”(另請參閱此答案 )。

添加空約束是最好的方法。 在此約束中,您將自己的@Pattern添加為組合約束。

@Target({ANNOTATION_TYPE, FIELD})
@Retention(RUNTIME)
@Documented
**@Pattern(regexp="...")**
@Constraint(validatedBy = EmptyValueConstraintValidator.class)
public @interface EmptyValueConstraint  {
    String message() default "{defaultMessage}";

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

    Class<? extends Payload>[] payload() default {};
    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
    @Retention(RUNTIME)
    @Documented
    @interface List {
        EmptyValueConstraint[] value();
    }
}

public class EmptyValueConstraintValidator  implements     
ConstraintValidator<EmptyValueConstraint, Object>{

    @Override
    public void initialize(EmptyValueConstraint constraintAnnotation) {

    }

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

        return true;
    }



}

希望這可以幫助..

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM