我有一個表格,其中包含一些radio
按鈕和check-boxes
。無論何時用戶選擇/取消選擇radio button
或check-box
其他幾個輸入字段都是啓用/禁用的。
我想添加驗證僅當用戶提交表格時啓用的字段。在提交時禁用的字段不應被視爲驗證。春季條件驗證
我不想在客戶端驗證中添加此項。是否有更好/簡單的方法在Spring 3.0中實現條件驗證,而不是在驗證器中添加多個if
?
謝謝!
我有一個表格,其中包含一些radio
按鈕和check-boxes
。無論何時用戶選擇/取消選擇radio button
或check-box
其他幾個輸入字段都是啓用/禁用的。
我想添加驗證僅當用戶提交表格時啓用的字段。在提交時禁用的字段不應被視爲驗證。春季條件驗證
我不想在客戶端驗證中添加此項。是否有更好/簡單的方法在Spring 3.0中實現條件驗證,而不是在驗證器中添加多個if
?
謝謝!
當字段將被禁用它們轉移控制器爲null
。我想添加一個驗證,它將允許null
即禁用字段或not blank
字段,即允許但空字段。
所以我創建了一個自定義註釋NotBlankOrNull
,這將允許null
和非空字符串,它也照顧空格。
這是我詮釋
@Documented
@Constraint(validatedBy = { NotBlankOrNullValidator.class })
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
public @interface NotBlankOrNull {
String message() default "{org.hibernate.validator.constraints.NotBlankOrNull.message}";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}
驗證
類public class NotBlankOrNullValidator implements ConstraintValidator<NotBlankOrNull, String> {
public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
if (s == null) {
return true;
}
return s.trim().length() > 0;
}
@Override
public void initialize(NotBlankOrNull constraint) {
}
}
我也更新我的site更多細節。
如果您使用JSR 303 Bean驗證,那麼您可以使用validation groups(groups
)。
假設你有這個用戶輸入,包含兩個部分。 這兩個布爾值指示段是啓用還是禁用。 (當然你也可以使用更多的有用的註釋比@NotNull
)
public class UserInput {
boolean sectionAEnabled;
boolean sectionBEnabled;
@NotNull(groups=SectionA.class)
String someSectionAInput;
@NotNull(groups=SectionA.class)
String someOtherSectionAInput;
@NotNull(groups=SectionB.class)
String someSectionBInput;
Getter and Setter
}
需要兩個接口的羣體。他們只能作爲標記。
public interface SectionA{}
public interface SectionB{}
Since Spring 3.1你可以使用Spring @Validated
註釋(而不是@Validate
)在你的控制器的方法來觸發該驗證:
@RequestMapping...
public void controllerMethod(
@Validated({SectionGroupA.class}) UserInput userInput,
BindingResult binding, ...){...}
春3.1之前有沒有辦法來指定驗證組應該用於驗證(因爲@Validated
不存在,並且@Validate
沒有組屬性),所以您需要通過ha開始驗證nd書面代碼:這是一個示例如何在Spring 3.0中啓用與巫婆節相關的驗證。
@RequestMapping...
public void controllerMethod(UserInput userInput,...){
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
List<Class<?>> groups = new ArrayList<Class<?>>();
groups.add(javax.validation.groups.Default.class); //Always validate default
if (userInput.isSectionAEnabled) {
groups.add(SectionA.class);
}
if (userInput.isSectionBEnabled) {
groups.add(SectionB.class);
}
Set<ConstraintViolation<UserInput>> validationResult =
validator.validate(userInput, groups.toArray(new Class[0]));
if(validationResult.isEmpty()) {
...
} else {
...
}
}
(順便說一句:用於彈簧3.0的溶液中,也可以讓Spring注入驗證:
@Inject javax.validation.Validator validator
<mvc:annotation-driven validator="validator"/>
<bean id="validator"
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="validationMessageSource" ref="messageSource" />
</bean>
)
看起來像一個非常好的建議。只是想知道如何將其應用於DTO中的領域。我有幾個字段不存在於bean/domain對象中,但存在於DTO中,我也想爲它們添加驗證。 – xyz 2012-02-13 09:34:51
您可以將這個javax.validation anntoation(NotNull,...)放在非常類的實體DTO的字段中......在上面的例子中,UserInput應該是一個DTO – Ralph 2012-02-13 09:44:50