2012-02-13 10 views
7

Używam sprawdzania poprawności opartego na adnotacji Spring 3. Chcę dodać następującą walidacji pól SmyczkowychI/lub warunek w sprawdzaniu poprawności opartym na adnotacji sprężynowej

pole może być Null LUB powinna ona zawierać non pusty ciąg

wiem adnotacja jak @Null, @NotEmpty ale jak można używać zarówno z warunek LUB?


Rozwiązanie:

Korzystanie @Size(min=1) pomaga ale nie obsługują spacji. Dodałem więc niestandardową adnotację NotBlankOrNull, która pozwoli null i niepustym łańcuchom również zajmie puste miejsca. Wielkie dzięki @Ralph.
Oto moja Adnotacja klasa

@Documented 
@Constraint(validatedBy = { NotBlankOrNullValidator.class }) 
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER }) 
@Retention(RUNTIME) 
public @interface NotBlankOrNull { 
    String message() default "{org.hibernate.validator.constraints.NotBlankOrNull.message}"; 

    Class<?>[] groups() default { }; 

    Class<? extends Payload>[] payload() default { }; 
} 

Validator

public class NotBlankOrNullValidator implements ConstraintValidator<NotBlankOrNull, String> { 

    public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) { 
     if (s == null) { 
      return true; 
     } 
     return s.trim().length() > 0; 
    } 

    @Override 
    public void initialize(NotBlankOrNull constraint) { 

    } 
} 

Mam również aktualizowane na moim site.

Odpowiedz

5

Po pierwsze, nie jest to sprawdzanie oparte na adnotacji wiosennej, jest to JSR 303 Bean Validation, zaimplementowana na przykład przez weryfikację Hibernate. To naprawdę nie jest związane ze sprężyną/

Nie można łączyć adnotacji w sposób LUB *.

Ale istnieje proste obejście ograniczenia nie zerowego, ponieważ najbardziej podstawowe zatwierdzenia akceptują wartość null jako prawidłowe dane wejściowe (dlatego często trzeba łączyć podstawowe zasady i dodatkowe @NotNull, jeśli chcesz mieć " normalne "zachowanie, ale nie to, o co prosiłeś).

Na przykład: @javax.validation.constraints.Size zaakceptuj wartość null jako prawidłowe dane wejściowe.

W tym przypadku potrzebna jest opcja @Size(min=1) zamiast @NotEmpty.

BTW: Nie @NotEmpty jest tylko połączenie @NotNull i @Size(min = 1)

* z wyjątkiem wdrożyć go przez siebie.

+0

Dziękuję wiele za sugestię i poprawienie mnie .Spróbowałem '@Size (min = 1)' i działa dla 'null' i niepustych ciągów. Zastanawiasz się, jak sobie poradzić, jeśli użytkownik wprowadzi spacje? – xyz

+0

@Ajinkya: spójrz na kod źródłowy NotBlank Adnotacja. Znowu jest opatrzone notatką NotNull. Ale jest to sprawdzane przez NotBlankValidator (na szczęście NotBlankValidator zwraca wartość true (valid) dla wartości null). Potrzebujesz więc własnej adnotacji, ale możesz ponownie użyć implementacji Validator> '@Constraint (validatedBy = {NotBlankValidator.class}) @ Target ... @ Retention ... public @interface NotBlankOrNull' – Ralph

+0

Wielkie dzięki człowieku :) – xyz

Powiązane problemy