Jeśli używasz sprawdzania JSR 303 Bean, możesz użyć do tego celu validation groups (groups
).
Załóżmy, że masz dane wejściowe użytkownika, zawierające dwie sekcje. Dwa wartości logiczne wskazujące, czy sekcje są włączone, czy wyłączone. (Oczywiście można użyć bardziej użyteczne niż adnotacje @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
}
Potrzebne są dwa interfejsy dla grup. Działają tylko jako znacznik.
public interface SectionA{}
public interface SectionB{}
Since Spring 3.1 można użyć Wiosna @Validated
adnotacji (zamiast @Validate
) w metodzie kontrolera do uruchomienia Walidacja:
@RequestMapping...
public void controllerMethod(
@Validated({SectionGroupA.class}) UserInput userInput,
BindingResult binding, ...){...}
przed wiosną 3.1 nie było sposobu, aby określić grupa walidacji, która powinna zostać użyta do sprawdzania poprawności (ponieważ @Validated
nie istnieje, a @Validate
nie ma atrybutu grupy), dlatego należy rozpocząć sprawdzanie poprawności za pomocą ha nd napisany kod: Ten przykład, jak wyzwalać sprawdzanie poprawności w zależności od sekcji wiedźm jest włączony w 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 {
...
}
}
(BTW: Do roztworu Wiosna 3.0, możliwe jest również, aby pozwolić Wiosna wstrzyknąć walidator:
@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>
)
Wygląda na naprawdę dobrą sugestię. Zastanawiasz się, jak zastosować to do pól obecnych w DTO. Mam kilka pól, które nie są obecne w obszarze bean/domain object, ale są obecne w DTO i chcę również dodać do nich weryfikacje. – xyz
Możesz umieścić tę anvację javax.validation (NotNull, ...) na polach bardzo klasowych, Entite DTO, ... W powyższym przykładzie UserInput powinno być DTO – Ralph