5

@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バリデーターメカニズムを解体し、独自の検証クラスを作成する必要があります。

4

3 に答える 3

3

これを実現するには、カスタムアノテーションを作成する必要があると思います。また、カスタムアノテーションを使用して他のHibernate検証制約を使用でき、何も削除する必要はありません。
詳細については、このリンクを確認してください。

于 2012-09-11T18:07:58.363 に答える
3

以下は私が思いついたコードです(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;
}

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

于 2012-09-13T16:42:51.263 に答える
1

必要なのは、エンティティのアノテーションをConstraintValidator使用したエンティティの実装です。@Constraint

ここで、他のフィールドに依存するフィールドに条件を設定します。フィールドに注釈を使用する制約は、他の制約(最大サイズ、null許容など)に依存せずに、フィールド自体で実行できるチェックに使用されることになっています。

于 2012-09-11T18:11:04.550 に答える