JSR 303 Bean doğrulamasını kullanırsanız, bunun için validation groups (groups
) kullanabilirsiniz.
İki bölüm içeren bu kullanıcı girdiniz olduğunu varsayalım. Bölümlerin etkinleştirilip devre dışı bırakıldığını belirten iki boolean. Sen grupları için iki Arayüzleri ihtiyaç
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
}
(Tabii ki @NotNull
daha yararlı ek açıklamaları kullanabilirsiniz). Sadece işaretleyici olarak çalışırlar.
public interface SectionA{}
public interface SectionB{}
Since Spring 3.1 doğrulamayı tetiklemek için denetleyici yönteminde (yerine @Validate
arasında) Bahar @Validated
ek açıklama kullanabilirsiniz:
@RequestMapping...
public void controllerMethod(
@Validated({SectionGroupA.class}) UserInput userInput,
BindingResult binding, ...){...}
Bahar 3.1 önce belirtmek için hiçbir yolu yoktu doğrulama için kullanılması gereken doğrulama grubu (@Validated
olmadığı ve @Validate
'un bir grup özniteliği olmadığı için), bu nedenle doğrulama işlemini ha tarafından başlatmanız gerekir. nd yazılı kod: Bu, bir örneği cadı bölümüne bağlı olarak validasyonun nasıl tetikleneceğinin ilkbahar 3.0'da etkinleştirildiğini gösterir.
@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 {
...
}
}
Gerçekten iyi bir öneriye benziyor. Sadece DTO'da bulunan alanlara nasıl uygulanacağını merak ediyorum. Fasulye/alan hedefinde bulunmayan, ancak DTO'da bulunan birkaç alanım var ve bunlar için de validasyonlar eklemek istiyorum. – xyz
Bu javax.validation anntoation'ı (NotNull, ...) çok sınıf, Entity DTO, ... alanlarına yerleştirebilirsiniz. Yukarıdaki örnekte, UserInput bir DTO olmalıdır. – Ralph