gpt4 book ai didi

jsf - f :validateWholeBean in JSF 2. 3

转载 作者:行者123 更新时间:2023-12-03 22:22:27 26 4
gpt4 key购买 nike

我想用 JSF 2.3 实现 f:validateWholeBean。我尝试使用 Mojarra 2.3.0-m05 和 Tomcat 8 实现此示例:

<h:form>
<h:panelGroup>
<h:inputSecret id="passwd" value="#{bean.dataList['passwd']}">
<f:ajax event="blur" render="passwdvalidator" />
</h:inputSecret>
<h:message id="passwdvalidator" for="passwd" />
</h:panelGroup>

<h:panelGroup>Confirm Password</h:panelGroup>
<h:panelGroup>
<h:inputSecret id="confurmpasswd" value="#{bean.dataList['passwd']}">
<f:ajax event="blur" render="confurmpasswdvalidator" />
</h:inputSecret>
<h:message id="confurmpasswdvalidator" for="confurmpasswd" />
</h:panelGroup>
<h:commandButton action="#{bean.submit}">
<f:ajax render="@form" execute="@form"></f:ajax>
</h:commandButton>

<f:validateWholeBean value="#{contactBean}" validationGroups="validateBean.ContactGroup" />
</h:form>

自定义验证器

@Named
@ViewScoped
public class NewAccountValidator implements Validator, Serializable
{
@Override
public void validate(FacesContext fc, UIComponent uic, Object o) throws ValidatorException
{
// not used
}

public void validatePasswords(FacesContext context, UIComponent component, Object value)
{
String l;
String s = value.toString().trim();

if (s != null)
{
// compare passwords
}
else
{
throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_INFO,
s.isEmpty() ? " This field cannot be empty!" : " '" + s + "' is not a number!", null));
}
}
}

使用 f:validateWholeBean 和自定义 JSF 验证器实现解决方案的正确方法是什么?

最佳答案

您不应该实现“标准”验证器,而应该实现ConstraintValidator

您可以在 Arjan Tijms Weblog 上找到示例:

<h:form>
<h:inputText value="#{indexBean.foo}">
<f:validateBean validationGroups="javax.validation.groups.Default,java.util.RandomAccess"/>
</h:inputText>
<h:inputText value="#{indexBean.bar}">
<f:validateBean validationGroups="javax.validation.groups.Default,java.util.RandomAccess"/>
</h:inputText>

<f:validateWholeBean value="#{indexBean}" validationGroups="java.util.RandomAccess"/>

<h:commandButton value="submit"/>
</h:form>

带有支持 bean:

@Named
@RequestScoped
@ValidIndexBean(groups = java.util.RandomAccess.class)
public class IndexBean implements ConstraintValidator<ValidIndexBean, IndexBean> {

@Constraint(validatedBy = IndexBean.class)
@Documented
@Target(TYPE)
@Retention(RUNTIME)
public @interface ValidIndexBean {
String message() default "Invalid Bean";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}

@Inject // @EJB
private PersistenceService service;

@NotNull
private String foo;

@NotNull
private String bar;

@Override
public void initialize(ValidIndexBean constraintAnnotation) {
//
}

@Override
public boolean isValid(IndexBean other, ConstraintValidatorContext context) {
// return other.getFoo().equals(other.getBar());

return service.query("select count(p) from Person p where p.foo like ?1 and p.bar like ?2", other.getFoo(), other.getBar()) == 0;
}

...
}

评论回答:

  • 这是一个普通 bean,所以是的,它可以是 @ViewScoped。
  • 那么您应该创建多个验证器:让单个验证器执行多个逻辑是一种不好的做法。

无关:

正如我从您发布的代码中看到的那样,您误解了“经典”验证器的使用,使其成为 ManagedBean(CDI 风格),但这不是“普通”使用JSF 验证器/转换器。

我想您不是在使用验证器,而是在使用验证方法

“经典”验证器应该看起来像(参见 here):

@FacesValidator("usernameValidator")
public class UsernameValidator implements Validator, Serializable
{
@Override
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException
{
// you should use THIS method to validate a single Component's Value

if(query("select count(*) from user where username = '?'", String.valueOf(value)) > 0)
{
throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "invalid username"));
}
}
}

应该像这样使用:

<h:inputText value="#{someBean.username}" validator="usernameValidator" />

所以:

  1. “经典”人脸验证器很难验证一个组件的值(value)
  2. 它们不应该是@ManagedBean 或@Named
  3. 它们应该通过名称引用(validator="usernameValidator",而不使用 EL 表达式 validator="#{usernameValidator}")

但是,验证器/转换器的最佳做法是“特化”:它们应该执行单一验证逻辑。

如果您需要验证组件值,即日期,它必须是非空并且大于 01/01/1970,您将需要两个专门的验证器。

关于jsf - f :validateWholeBean in JSF 2. 3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36940125/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com