我有一个表格,其中包含一些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