2012-09-11 11 views
5

@NotEmptyのようなHibernateバリデータを使って、クラス内の特定のプロパティが空であるかどうかを調べています。クラスは次のとおりです。Hibernate Validator:アノテーションにif - else kindのロジックを使用する

@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"が空のときは、ブラウザのフォームに正しいエラーメッセージが表示されます。

ここで状況が変わりました。新しい要件では、プロパティ "homePageMes​​sage"は、他のプロパティ "messagesEnabled"が1に設定されている場合にのみ空にできます。 "0"に設定されている場合、 "homePageMes​​sage"に対して空のチェックが行われません。簡単に言えば、 "homePageMes​​sage"の検証は "messagesEnabled"の値に依存するはずです。

私の質問:これはアノテーションで可能ですか?そうでなければ、私は自分の休止状態のバリデータメカニズムを解体し、自分自身のバリデーションクラスを作成する必要があります。

答えて

2

は、私が(Ajinkyaとアレックスからの提案の後)を思い付いたコードです:

カスタマイズ注釈:

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

私はそれが誰かを助けてくれることを願っています。

3

私はこれを達成するためにカスタム注釈を書く必要があると思います。また、カスタムアノテーションで他のハイバネートの検証制約を使用することもできます。何も削除する必要はありません。
詳細はlinkをご確認ください。

+0

リンクをご利用いただきありがとうございます。それは役に立ちました。カスタムアノテーションを作成しようとします。 – Raj

+0

グッドスタッフ私の男。 –

1

エンティティのConstraintValidatorの実装で、@Constraintアノテーションを使用してください。

これは、他のフィールドに依存するフィールドに条件を設定する場所です。フィールド上の注釈を使用する制約は、フィールド自体に対して行うことができ、別のもの(max size、nullableなどなど)に依存しないチェックに使用されるはずです。続き

+0

ありがとうアレックス。私はConstraintValidatorを使用して、提案されたようにカスタムアノテーションを記述します。 – Raj

関連する問題