2012-02-13 7 views
7

Tôi đang sử dụng xác thực dựa trên chú thích dựa trên Spring 3. Tôi muốn thêm một xác nhận sau cho lĩnh vực ChuỗiVà/Hoặc điều kiện trong xác nhận dựa trên chú thích mùa xuân

Dòng có thể Null HOẶC nó nên chứa một chuỗi không có sản phẩm nào

Tôi biết chú thích như @Null, @NotEmpty nhưng làm thế nào tôi có thể sử dụng cả hai với một điều kiện OR?


Giải pháp:

Sử dụng @Size(min=1) giúp nhưng nó không xử lý không gian. Vì vậy, thêm chú thích tùy chỉnh NotBlankOrNull sẽ cho phép null và các chuỗi không trống cũng sẽ chú ý đến các khoảng trống. Cảm ơn rất nhiều @Ralph.
Đây là Chú tôi

@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 lớp

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) { 

    } 
} 

Tôi cũng đã cập nhật nó trên site tôi.

Trả lời

5

Trước hết, nó không phải là xác nhận dựa trên chú thích mùa xuân, nó là xác thực đậu JSR 303, được thực hiện ví dụ bằng xác thực Hibernate. Nó thực sự không liên quan đến mùa xuân/

Bạn không thể kết hợp chú thích theo cách HOẶC *.

Nhưng có một cách giải quyết đơn giản cho ràng buộc không rỗng, vì các xác thực cơ bản nhất chấp nhận null là đầu vào hợp lệ (do đó bạn thường cần kết hợp các khoản thanh toán cơ bản và thêm @NotNull, nếu bạn muốn có " hành vi bình thường "nhưng không phải những gì bạn yêu cầu).

Ví dụ: @javax.validation.constraints.Size chấp nhận null làm đầu vào hợp lệ.

Vì vậy, những gì bạn cần trong trường hợp của mình là sử dụng @Size(min=1) thay vì @NotEmpty.

BTW: Không @NotEmpty chỉ là một sự kết hợp của @NotNull@Size(min = 1)

* ngoại trừ bạn thực hiện nó bằng cách tự của bạn.

+0

Cảm ơn rất nhiều gợi ý và sửa tôi .Tôi đã thử '@Size (min = 1)' và nó hoạt động đối với 'null' và chuỗi rỗng. Chỉ cần tự hỏi làm thế nào để đối phó với nếu người dùng vào không gian? – xyz

+0

@Ajinkya: hãy xem mã nguồn chú thích NotBlank. Một lần nữa nó được chú thích với NotNull. Nhưng nó được validatedBy NotBlankValidator (fortunaly NotBlankValidator trả về true (hợp lệ) cho null). Vì vậy, bạn cần chú thích của riêng bạn nhưng có thể tái sử dụng việc thực hiện Validator> '@Constraint (validatedBy = {NotBlankValidator.class}) @ Mục tiêu ... @ Retention ... public @interface NotBlankOrNull' – Ralph

+0

Cảm ơn rất nhiều người đàn ông :) – xyz