2012-09-11 14 views
5

Tôi đang sử dụng trình xác nhận Hibernate như @NotEmpty để xem một thuộc tính cụ thể trong một lớp có trống hay không. Lớp học như sau:Hibernate Validator: Sử dụng if - else loại logic trong chú thích

@Entity 
@Table(name="emergency_messages") 
public class EmergencyMessages implements Serializable { 

@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY) 
@Column(name="id", nullable=false) 
private Integer id; 

@NotEmpty(message="Home message cannot be empty") 
@Column(name="home_page_message") 
private String homePageMessage; 

@Range(min=0, max=1, message="Please select one of the display announcement value") 
@Column(name="messages_enabled") 
private Integer messagesEnabled; 
} 

Cho đến nay rất tốt. Bất cứ khi nào thuộc tính "homePageMessage" trống thì tôi có thể thấy thông báo lỗi chính xác trong biểu mẫu trong trình duyệt.

Hiện tại, tình hình đã thay đổi. Yêu cầu mới là thuộc tính "homePageMessage" chỉ có thể trống nếu thuộc tính khác "messagesEnabled" được đặt thành 1. Nếu nó được đặt thành 0 thì sẽ không có kiểm tra trống nào được thực hiện cho "homePageMessage". Nói một cách đơn giản, việc xác thực "homePageMessage" bây giờ sẽ phụ thuộc vào giá trị "messagesEnabled".

Câu hỏi của tôi: Điều này có thể thực hiện với chú thích không? Nếu không, sau đó tôi sẽ phải tháo dỡ cơ chế xác nhận hibernate của tôi và tạo lớp xác nhận của riêng tôi.

Trả lời

2

Sau đây là đoạn code mà tôi đã đưa ra (sau khi lời đề nghị từ Ajinkya và Alex):

Chú Customized:

import java.lang.annotation.Documented; 
import java.lang.annotation.ElementType; 
import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 
import java.lang.annotation.Target; 

import javax.validation.Constraint; 
import javax.validation.Payload; 

@Target({ElementType.TYPE}) 
@Retention(RetentionPolicy.RUNTIME) 
@Documented 
@Constraint(validatedBy=HomePageEmptyMessageValidator.class) 
public @interface HomePageEmptyMessage { 

String message() default ""; 

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

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

Validator Customized:

import javax.validation.ConstraintValidator; 
import javax.validation.ConstraintValidatorContext; 

public class HomePageEmptyMessageValidator implements ConstraintValidator<HomePageEmptyMessage, EmergencyMessages> { 

@Override 
public void initialize(HomePageEmptyMessage homePageEmptyMessage) { 
} 

@Override 
public boolean isValid(EmergencyMessages emergencyMessages, ConstraintValidatorContext context) { 

    if (emergencyMessages == null) { 
     return false; 
    } 

    Integer messageEnabled = emergencyMessages.getMessagesEnabled(); 
    if (messageEnabled != null) { 
     if (messageEnabled == 1) { 
      String homePageMessage = emergencyMessages.getHomePageMessage(); 
      if (Util.isNullOrEmpty(homePageMessage)) { 
       return false; 
      } else { 
       return true; 
      } 
     } else { 
      return true; 
     } 
    } 

    return false; 
} 

} 

Sử dụng chú thích tùy chỉnh trong mã:

@Entity 
@Table(name="emergency_messages") 
@HomePageEmptyMessage(message="Home page annoucement cannot be empty if the Display Announcement is set to Yes") 
public class EmergencyMessages implements Serializable { 

private static final long serialVersionUID = -7870767517772161300L; 

@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY) 
@Column(name="id", nullable=false) 
private Integer id; 

@Column(name="home_page_message") 
private String homePageMessage; 

@Range(min=0, max=1, message="Please select one of the display announcement value") 
@Column(name="messages_enabled") 
private Integer messagesEnabled; 
} 

Tôi hy vọng nó sẽ giúp ai đó.

3

Tôi nghĩ bạn cần viết chú thích tùy chỉnh để đạt được điều này. Ngoài ra, bạn có thể sử dụng hạn chế xác nhận ngủ đông khác với chú thích tùy chỉnh, không cần phải xóa bất kỳ thứ gì.
Kiểm tra điều này link để biết chi tiết.

+0

Cảm ơn bạn đã chia sẻ liên kết. Nó rất hữu ích. Tôi sẽ cố gắng viết chú thích tùy chỉnh. – Raj

+0

Tốt thứ của tôi. –

1

Những gì bạn cần là triển khai ConstraintValidator cho pháp nhân của mình, sử dụng chú thích @Constraint trên đó.

Đây là nơi bạn sẽ đặt điều kiện vào các trường phụ thuộc vào các trường khác. Các ràng buộc bằng cách sử dụng chú thích trên trường được cho là được sử dụng để kiểm tra có thể được thực hiện trên chính trường đó và không phụ thuộc vào các chú thích khác (như kích thước tối đa, giá trị rỗng, v.v ...).

+0

Cảm ơn Alex. Tôi sẽ sử dụng ConstraintValidator để viết chú thích tùy chỉnh theo gợi ý. – Raj