Si usa la validación de Bean JSR 303, entonces puede usar validation groups (groups
) para esto.
Supongamos que tiene esta entrada de usuario, que contiene dos secciones. Los dos booleanos que indican si las secciones están habilitadas o deshabilitadas. (Por supuesto, puede utilizar las anotaciones más útiles que @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
}
Se necesitan dos interfaces para los grupos. Ellos trabajan solo como marcador.
public interface SectionA{}
public interface SectionB{}
Since Spring 3.1 puede utilizar la anotación primavera @Validated
(en lugar de @Validate
) en su método de control para activar la validación:
@RequestMapping...
public void controllerMethod(
@Validated({SectionGroupA.class}) UserInput userInput,
BindingResult binding, ...){...}
antes de la primavera 3,1 no había manera de especificar el grupo de validación que debe usarse para la validación (porque @Validated
no existe y @Validate
no tiene un atributo de grupo), por lo que debe iniciar la validación por ha nd código escrito: Este es un ejemplo de cómo activar la validación en dependencia de la sección de brujas en 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 {
...
}
}
(Por cierto: Para la solución Spring 3.0, también es posible hacer que la primavera inyectar el validador:
@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>
)
Parece una muy buena sugerencia. Me preguntaba cómo aplicar esto a los campos presentes en DTO. Tengo algunos campos que no están presentes en el objeto bean/domain pero están presentes en DTO y también quiero agregar validaciones para ellos. – xyz
Puede poner esta anotación javax.validation (NotNull, ...) en campos de la misma clase, Entity DTO, ... En el ejemplo anterior, UserInput debería ser un DTO – Ralph