2010-04-18 71 views
8

Tôi đang xem xét sử dụng Trình xác thực Hibernate cho một yêu cầu của tôi. Tôi muốn xác nhận hợp lệ một JavaBean nơi các thuộc tính có thể có nhiều kiểm tra xác nhận hợp lệ. Ví dụ:Tạo mã lỗi cho mỗi thuộc tính trong Hibernate Validator

class MyValidationBean 
{ 
    @NotNull 
    @Length(min = 5, max = 10) 
    private String myProperty; 
} 

Nhưng nếu khách sạn này không xác nhận, tôi muốn có một mã lỗi cụ thể liên quan đến việc ConstraintViolation, bất kể nó không thành công vì @Required hoặc @Length, mặc dù tôi muốn giữ gìn lỗi thông điệp.

class MyValidationBean 
{ 
    @NotNull 
    @Length(min = 5, max = 10) 
    @ErrorCode("1234") 
    private String myProperty; 
} 

Điều gì đó như trên sẽ tốt nhưng không cần phải cấu trúc chính xác như vậy. Tôi không thể nhìn thấy một cách để làm điều này với Hibernate Validator. Có thể không?

Trả lời

0

Từ phần 4.2. ConstraintViolation của đặc tả:

Phương pháp getMessageTemplate trả về thông báo lỗi không suy (thường là message thuộc tính trên tờ khai hạn chế). Các khung có thể sử dụng nó như một mã khóa lỗi.

Tôi nghĩ đây là lựa chọn tốt nhất của bạn.

+1

Cảm ơn bạn đã trả lời. Thật không may tôi không nghĩ rằng điều này sẽ bảo vệ thông báo lỗi ban đầu, mà tôi muốn. Tôi đang tìm một mã lỗi bổ sung trên đầu trang này. Đáng buồn nhìn vào API cho ConstraintViolation Tôi không thực sự nhìn thấy bất cứ điều gì có vẻ đầy hứa hẹn. –

0

Những gì tôi sẽ cố gắng làm là cô lập hành vi này trên Lớp DAO của ứng dụng.

Sử dụng ví dụ của bạn, chúng tôi sẽ có:

public class MyValidationBeanDAO { 
    public void persist(MyValidationBean element) throws DAOException{ 
     Set<ConstraintViolation> constraintViolations = validator.validate(element); 
     if(!constraintViolations.isEmpty()){ 
      throw new DAOException("1234", contraintViolations); 
     } 
     // it's ok, just persist it 
     session.saveOrUpdate(element); 
    } 
} 

Và các lớp ngoại lệ sau đây:

public class DAOException extends Exception { 
private final String errorCode; 
private final Set<ConstraintViolation> constraintViolations; 

public DAOException(String errorCode, Set<ConstraintViolation> constraintViolations){ 
    super(String.format("Errorcode %s", errorCode)); 
    this.errorCode = errorCode; 
    this.constraintViolations = constraintViolations; 
} 
// getters for properties here 
} 

Bạn có thể thêm một số thông tin chú thích dựa trên những gì bất động sản vẫn chưa được xác nhận từ đây, nhưng luôn luôn làm điều này trên phương pháp DAO.

Tôi hy vọng điều này sẽ hữu ích.

4

Bạn có thể tạo chú thích tùy chỉnh để có được hành vi bạn đang tìm kiếm, sau đó xác thực và sử dụng tính năng tái chọn, bạn có thể trích xuất giá trị của chú thích. Một cái gì đó như sau:

@Target({ElementType.FIELD}) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface ErrorCode { 
    String value(); 
} 

Trong đậu của bạn:

@NotNull 
@Length(min = 5, max = 10) 
@ErrorCode("1234") 
public String myProperty; 

On phê đậu của bạn:

Set<ConstraintViolation<MyValidationBean>> constraintViolations = validator.validate(myValidationBean);  
for (ConstraintViolation<MyValidationBean>cv: constraintViolations) { 
    ErrorCode errorCode = cv.getRootBeanClass().getField(cv.getPropertyPath().toString()).getAnnotation(ErrorCode.class); 
    System.out.println("ErrorCode:" + errorCode.value()); 
} 

Có nói rằng tôi có lẽ sẽ đặt câu hỏi về các yêu cầu về việc muốn mã lỗi cho các các loại tin nhắn.

+0

Đây là một giải pháp tuyệt vời mà nhiều người cảm ơn vì đã đăng bài. Chỉ cần một điều cần lưu ý .. Mã nên đọc getDeclaredField để cho phép nó truy cập vào trường riêng. – MandyW

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