2013-08-13 48 views
10

Làm cách nào để sử dụng chú thích ngủ đông để xác thực trường thành viên enum? Sau đây không hoạt động:Cách sử dụng chú thích xác thực Hibernate với enums?

enum UserRole { 
    USER, ADMIN; 
} 

class User { 
    @NotBlank //HV000030: No validator could be found for type: UserRole. 
    UserRole userRole; 
} 
+1

bạn đã thử với @Nonnull chưa? –

Trả lời

28

Lưu ý bạn cũng có thể tạo trình xác thực để kiểm tra Chuỗi là một phần của điều tra.

public enum UserType { PERSON, COMPANY } 

@NotNull 
@StringEnumeration(enumClass = UserCivility.class) 
private String title; 

@Documented 
@Constraint(validatedBy = StringEnumerationValidator.class) 
@Target({ METHOD, FIELD, ANNOTATION_TYPE, PARAMETER, CONSTRUCTOR }) 
@Retention(RUNTIME) 
public @interface StringEnumeration { 

    String message() default "{com.xxx.bean.validation.constraints.StringEnumeration.message}"; 
    Class<?>[] groups() default {}; 
    Class<? extends Payload>[] payload() default {}; 

    Class<? extends Enum<?>> enumClass(); 

} 

public class StringEnumerationValidator implements ConstraintValidator<StringEnumeration, String> { 

    private Set<String> AVAILABLE_ENUM_NAMES; 

    @Override 
    public void initialize(StringEnumeration stringEnumeration) { 
    Class<? extends Enum<?>> enumSelected = stringEnumeration.enumClass(); 
    //Set<? extends Enum<?>> enumInstances = EnumSet.allOf(enumSelected); 
    Set<? extends Enum<?>> enumInstances = Sets.newHashSet(enumSelected.getEnumConstants()); 
    AVAILABLE_ENUM_NAMES = FluentIterable 
      .from(enumInstances) 
      .transform(PrimitiveGuavaFunctions.ENUM_TO_NAME) 
      .toSet(); 
    } 

    @Override 
    public boolean isValid(String value, ConstraintValidatorContext context) { 
    if (value == null) { 
     return true; 
    } else { 
     return AVAILABLE_ENUM_NAMES.contains(value); 
    } 
    } 

} 

này là tốt đẹp bởi vì bạn không mất thông tin của "giá trị sai". Bạn có thể nhận được thông báo như

Giá trị "someBadUserType" không phải là Kiểu người dùng hợp lệ. Loại người dùng hợp lệ giá trị là: NGƯỜI, CÔNG TY


Sửa

Đối với những người muốn có một phiên bản không Ổi nó nên làm việc với một cái gì đó như:

public class StringEnumerationValidator implements ConstraintValidator<StringEnumeration, String> { 

    private Set<String> AVAILABLE_ENUM_NAMES; 

    public static Set<String> getNamesSet(Class<? extends Enum<?>> e) { 
    Enum<?>[] enums = e.getEnumConstants(); 
    String[] names = new String[enums.length]; 
    for (int i = 0; i < enums.length; i++) { 
     names[i] = enums[i].name(); 
    } 
    Set<String> mySet = new HashSet<String>(Arrays.asList(names)); 
    return mySet; 
    } 

    @Override 
    public void initialize(StringEnumeration stringEnumeration) { 
    Class<? extends Enum<?>> enumSelected = stringEnumeration.enumClass(); 
    AVAILABLE_ENUM_NAMES = getNamesSet(enumSelected); 
    } 

    @Override 
    public boolean isValid(String value, ConstraintValidatorContext context) { 
    if (value == null) { 
     return true; 
    } else { 
     return AVAILABLE_ENUM_NAMES.contains(value); 
    } 
    } 

} 

Và để tùy chỉnh thông báo lỗi và hiển thị các giá trị thích hợp, kiểm tra điều này: https://stackoverflow.com/a/19833921/82609

+0

Làm thế nào điều này có thể được viết mà không có chức năng ổi? – membersound

+1

@membersound thực sự không có phức tạp ở tất cả làm điều này. Bạn chỉ cần chuyển đổi một mảng enum ('enumSelected.getEnumConstants()' thành một tập hợp các tên enum ('AVAILABLE_ENUM_NAMES') và bạn sẽ dễ dàng tìm thấy các hướng dẫn để làm điều đó với Java :) xem tại đây http: // stackoverflow. com/questions/13783295/get-all-name-in-an-enum-as-a-string –

+0

OK xin lỗi, có lẽ tôi hiểu lầm: Tôi nghĩ rằng nó sẽ có thể tạo ra một thông báo lỗi mặc định chung chung, và bên trong in tất cả các giá trị enum chung., – membersound

9

@NotBlank

Validate rằng chuỗi chú thích là không null hoặc rỗng. Sự khác biệt đối với NotEmpty là các khoảng trống ở cuối đang bị bỏ qua.

Trong trường hợp như UserRole không phải là String và một object Sử dụng @NotNull

Yếu tố chú thích không phải là null. Chấp nhận bất kỳ loại nào.

Các vấn đề liên quan