簡體   English   中英

Hibernate Validator:在注釋中使用if - else類型的邏輯

[英]Hibernate Validator : Using if - else kind of logic in annotation

我正在使用像@NotEmpty這樣的Hibernate驗證器來查看類中的特定屬性是否為空。 課程如下所示:

@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;
}

到現在為止還挺好。 每當屬性“homePageMes​​sage”為空時,我都可以在瀏覽器中看到表單中的正確錯誤消息。

現在情況發生了變化。 新要求是,只有當其他屬性“messagesEnabled”設置為1時,屬性“homePageMes​​sage”才可以為空。如果設置為0,則“homePageMes​​sage”不應進行空檢查。 簡單來說,“homePageMes​​sage”的驗證現在應該依賴於“messagesEnabled”值。

我的問題:這可能與注釋有關嗎? 如果沒有,那么我將不得不拆除我的hibernate驗證器機制並創建我自己的驗證類。

我認為你需要編寫自定義注釋來實現這一目標。 您還可以使用其他hibernate驗證約束和自定義注釋,無需刪除任何內容。
請查看此鏈接了解詳情。

以下是我提出的代碼(在Ajinkya和Alex的建議之后):

自定義注釋:

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 {};
}

定制驗證器:

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;
}

}

在代碼中使用自定義注釋:

@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;
}

我希望它對某人有幫助。

您需要的是實體的ConstraintValidator實現,使用@Constraint注釋。

這是您將條件放在依賴於其他字段的字段上的位置。 使用字段上的注釋的約束應該用於可以在字段本身上進行的檢查,而不是依賴於另一個(例如max size,nullable等...)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM