gpt4 book ai didi

java - 在 PrimeFaces 表单中验证后,JSF 转换器无法工作

转载 作者:太空宇宙 更新时间:2023-11-04 08:18:07 25 4
gpt4 key购买 nike

我正在开发一个使用 JSF 2.1 和 PrimeFaces 3.2、服务器 Tomcat 7 的应用程序。现在,我正在开发用于注册新用户的表单。问题出在转换器中。

我使用了很少的标准字段,其中两个是密码。我有自定义的密码数据类型,所以我想使用转换器将字符串数据从字段转换为 bean 中的密码变量。 Primefaces表单提交后使用AJAX,可能存在问题。如果我完整填写表格,没有验证错误,则一切正常。但是,如果存在验证错误并且没有转换器错误(我检查转换器中的密码长度),则整个表单将完全停止工作。我必须刷新页面才能使其再次工作。

以下是一些来源:

密码类别:

public class Password {

public static final short MIN_LENGTH = 5;

private String text;
private String hash;

public Password(String text) {
this.text = text;
this.hash = Hasher.sha512(text);
}

/**
* Get password instance with known hash only
* @param hash SHA-512 hash
* @return Password instance
*/
public static Password getFromHash(String hash) {
Password password = new Password(null);
password.hash = hash;
return password;
}



@Override
public int hashCode() {
return hash.hashCode();
}

@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Password other = (Password) obj;
if ((this.hash == null) ? (other.hash != null) : !this.hash.equals(other.hash)) {
return false;
}
return true;
}

@Override
public String toString() {
return hash;
}

/**
* @return the text
*/
public String getText() {
return text;
}
}

密码转换器:

@FacesConverter(forClass = Password.class)
public class PasswordConverter implements Converter {

@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
String text = (String) value;

if (text.length() >= Password.MIN_LENGTH) {
return new Password(text);
}

FacesMessage msg = new FacesMessage(Texter.get("forms/forms", "shortPassword").replace("%limit%", String.valueOf(Password.MIN_LENGTH)));
msg.setSeverity(FacesMessage.SEVERITY_ERROR);
throw new ConverterException(msg);
}

@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
try {
Password password = (Password) value;
return password.getText();
} catch (Exception ex) {
throw new ConverterException(ex);
}
}
}

facelet 中的形式:

<h:form id="registration">
<p:panelGrid columns="3">

<h:outputLabel value="#{commonTxt.email}:" for="email" />
<p:inputText id="email" value="#{userRegistrationForm.email}" required="true" requiredMessage="#{formsTxt.msgEmpty}">
<f:validator validatorId="email" />

<f:validator validatorId="unique" />
<f:attribute name="entity" value="SystemUser" />
<f:attribute name="field" value="email" />
<f:attribute name="uniqueMessage" value="#{formsTxt.nonUniqueEmail}" />
</p:inputText>
<p:message for="email" />

<h:outputLabel value="#{usersTxt.password}:" for="password" />
<p:password id="password" value="#{userRegistrationForm.password}" binding="#{password}" autocomplete="off" feedback="true" weakLabel="#{formsTxt.passwordWeak}" goodLabel="#{formsTxt.passwordGood}" strongLabel="#{formsTxt.passwordStrong}" promptLabel="#{formsTxt.passwordPrompt}" />
<p:message for="password" />

<h:outputLabel value="#{usersTxt.passwordCheck}:" for="passwordCheck" />
<p:password id="passwordCheck" value="#{userRegistrationForm.passwordCheck}" binding="#{passwordCheckInput}" autocomplete="off">
<f:validator validatorId="match" />
<f:attribute name="matchAgainst" value="#{password}" />
<f:attribute name="matchMessage" value="#{formsTxt.passwordMismatch}" />
</p:password>
<p:message for="passwordCheck" />

<p:column /><p:column /><p:column />

<h:outputLabel value="#{usersTxt.name}:" for="name" />
<p:inputText id="name" value="#{userRegistrationForm.name}" maxlength="255" required="true" requiredMessage="#{formsTxt.msgEmpty}" />
<p:message for="name" />


<f:facet name="footer">
<p:commandButton value="#{usersTxt.register}" action="#{userRegistrationForm.register()}" update="registration" />
</f:facet>
</p:panelGrid>
</h:form>

我不会发布 bean #{userRegistrationForm} 的代码,有两个带有 getter 和 setter 的密码属性。

任何有助于解决我的问题的帮助都表示赞赏。提前致谢。

最佳答案

解决了!我只是使用 FacesContext.getCurrentInstance().isValidationFailed() 来查看验证是否失败。如果失败,转换器现在返回 null(转换不会完成),在其他情况下转换器将返回正确的对象。并且该表单可以很好地进行转换。

关于java - 在 PrimeFaces 表单中验证后,JSF 转换器无法工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10075711/

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