Если вы используете JSR 303 Bean validation, вы можете использовать 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 й код: это пример того, как инициировать проверку в зависимости от раздела ведьмы, включен в 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, также возможно, чтобы позволить Спринг впрыскивать валидатор:
@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 objecct, но присутствуют в DTO, и я хочу добавить для них также проверки. – xyz
Вы можете поместить эту аннотацию javax.validation (NotNull, ...) в полях очень класса, Entity DTO, ... В приведенном выше примере UserInput должен быть DTO – Ralph