2009-09-01 15 views
1

私はプロジェクトのための簡単なカスタムバリデーターを作成しようとしています。条件付きでバリデーションを行う継ぎ目を見つける方法を見つけることができません。SEAMの別のフィールドの値に応じて、必要に応じてフィールドを検証できますか?

は、ここで私が持っているものです:私は必要なもの

@RequiredIfSelected 
public class AdSiteHelper { 
    private Date start; 
    private Date end; 
    private boolean selected; 
    /* getters and setters implied */ 
} 

(つまり実体ではありません)

Beanをバックアップヘルパー/「開始」と「終了」場合に必要とされるのです選択された場合にのみ真となります。

TYPEターゲットでカスタムバリデーターを作成しようとしましたが、seamはそれを取り上げて検証したくないようです。ここで初心者のための私のカスタム注釈の一般的な考えです

(それは実体ではないので、たぶん?):

@ValidatorClass(RequiredIfSelectedValidator.class) 
@Target(ElementType.TYPE) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface RequiredIfSelected { 
    String message(); 
} 

public class RequiredIfSelectedValidator implements Validator<RequiredIfSelected>, Serializable { 
    public boolean isValid(Object value) { 
    AdSiteHelper ash = (AdSiteHelper) value; 
    return !ash.isSelected() || (ash.getStart() && ash.getEnd()); 
    } 
    public void initialize(RequiredIfSelected parameters) { } 
} 

答えて

1

は私がthis postによってカバーされ、同様の問題がありました。あなたの豆は、これらの値を保持する場合は常に、あなたはちょうどあなたがSeamに使用しているとして、あなたのバリデータは非常に複雑である必要はありません。また

//Assuming you have the @Name annotation populated on your Bean and a Scope of CONVERSATION or higher 
AdSiteHelper helper = (AdSiteHelper)Component.getInstance("adSiteHelper"); 

であなたのバリデータにそれの現在のインスタンスをロードする可能性が同じです。あなたはインターフェイスを必要とせず、それは簡単なことができます

@Name("requiredIfSelectedValidator") 
@Validator 
public class RequiredIfSelectedValidator implements javax.faces.validator.Validator { 
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { 
     //do stuff 
    } 
} 
関連する問題