2009-09-01 8 views
1

J'essaye de créer un simple validateur personnalisé pour mon projet, et je n'arrive pas à trouver un moyen d'obtenir une couture pour valider les choses conditionnellement.Comment puis-je valider un champ en fonction de la valeur d'un autre champ dans SEAM?

Voici ce que j'ai:

Un grain d'aide/support (ce n'est pas une entité)

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

Ce que j'ai besoin est pour « commencer » et « fin » être nécessaire si et seulement si sélectionné est vrai.

J'ai essayé de créer un validateur personnalisé à la cible TYPE, mais la couture ne semble pas vouloir le ramasser et le valider. (Peut-être parce que ce n'est pas une entité?)

est ici l'idée générale de mon annotation personnalisée pour commencer:

@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) { } 
} 

Répondre

1

J'ai eu un problème similaire couvert par this post. Si votre Bean la tenue de ces valeurs est toujours le même alors vous pouvez charger l'instance actuelle dans votre Validator avec

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

également que vous utilisez vos Seam validateurs ne pas besoin d'être si complexe. Vous n'avez pas besoin d'une interface et il peut être aussi simple que

@Name("requiredIfSelectedValidator") 
@Validator 
public class RequiredIfSelectedValidator implements javax.faces.validator.Validator { 
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { 
     //do stuff 
    } 
} 
Questions connexes