如何根据SEAM中其他字段的值来验证字段?

时间:2009-09-01 23:22:58

标签: java hibernate validation annotations seam

我正在尝试为我的项目创建一个简单的自定义验证器,我似乎无法找到一种方法来获取有条件地验证事物的接缝。

这就是我所拥有的:

辅助/支持bean(不是实体)

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

当且仅当选择为真时,我需要“开始”和“结束”。

我尝试在TYPE目标上创建自定义验证器,但是接缝似乎不想拿起并验证它。 (也许是因为它不是一个实体?)

这是我的初学者自定义注释的一般概念:

@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 个答案:

答案 0 :(得分:1)

this post涵盖了类似的问题。如果持有这些值的Bean始终相同,那么您可以使用

将其当前实例加载到Validator中
//Assuming you have the @Name annotation populated on your Bean and a Scope of CONVERSATION or higher
AdSiteHelper helper = (AdSiteHelper)Component.getInstance("adSiteHelper");

同样,当您使用Seam时,您的验证器不需要那么复杂。您不需要界面,它可以像

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