Если вы используете проверку bean-компонента JSR 303, вы можете использовать для этого группы проверки (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{}
Начиная с Spring 3.1 вы можете использовать аннотацию Spring @Validated
(вместо @Validate
) в вашем методе контроллера для запуска проверки:
@RequestMapping...
public void controllerMethod(
@Validated({SectionGroupA.class}) UserInput userInput,
BindingResult binding, ...){...}
До весны 3.1 не было возможности указать группу проверки, которая должна использоваться для проверки (поскольку @Validated
не существует и @Validate
не имеет атрибута группы), поэтому вам нужно чтобы запустить проверку вручную написанным кодом: в 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 {
...
}
}
(Кстати: для решения Spring 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>
)