根据<h:message for="" />
JSF对象,我有一个问题。我有一个JSF 1.1(是的,不幸的是)myFaces项目。我准备了一个带有label,inputText和message holder的简单JSP文件:
<h:form id="sacLinkForm">
<cblFaces:outputLabel for="dedicatedCashAccountNumber"
value="#{appBundle.KUSTA_DEDICATED_CASH_ACCOUNT_NUMBER}"/>
<t:inputText id="dedicatedCashAccountNumber"
value="#{createController.modelFE.sacLink.dedicatedCashAccountNumber}"/>
<h:message id="dedicatedCashAccountNumberError"
for="dedicatedCashAccountNumber" />
</h:form>
我也创建了简单的验证方法:
public static boolean validate(SACLink link) {
boolean isError = false;
FacesContext context = FacesContext.getCurrentInstance();
FacesMessage message = new FacesMessage();
message.setSeverity(FacesMessage.SEVERITY_ERROR);
if (StringUtils.isEmpty(link.dedicatedCashAccountNumber)) {
//MessageUtils.addErrorMessage("dedicatedCashAccountNumber", "Dedicated Cash Account Number is mandatory");
message.setSummary("Field mandatory");
message.setDetail("Dedicated Cash Account Number is mandatory");
context.addMessage("sacLinkForm:dedicatedCashAccountNumber", message);
isError = true;
}
return !isError;
}
我的问题在于sacLinkForm:dedicatedCashAccountNumber
,因为已编译的JSP已生成id(f.e。_idJsp12:DynTab2:DynView2:tabK.....er:vKustaMa....Controller:sacLinkForm:dedicatedCashAccountNumber
),并且可能导致addMessage
方法与h:message for=".."
属性不对应。
因此,消息无法正确显示,因为java无法找到正确的h:message
对象。有没有办法如何从Java中将消息设置为正确的h:message
?我假设如何在JSF 1.1页面中强制“常量”组件ID。
谢谢。
答案 0 :(得分:4)
您根本不应该在JSF操作方法中手动执行验证。您应该使用JSF内置验证工具。您应该使用普通的JSF Validator
。您抛出的任何ValidatorException
将最终出现在正确的消息组件中。
用以下类替换validate()
方法:
public class AccountNumberValidator implements Validator {
@Override
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
if (StringUtils.isEmpty(value)) {
FacesMessage message = new FacesMessage();
message.setSeverity(FacesMessage.SEVERITY_ERROR);
message.setSummary("Field mandatory");
message.setDetail("Dedicated Cash Account Number is mandatory");
throw new ValidatorException(message);
}
}
}
在faces-config.xml
注册,如下所示:
<validator>
<validator-id>accountNumberValidator</validator-id>
<validator-class>com.example.AccountNumberValidator</validator-class>
</validator>
在视图中使用它如下:
<t:inputText id="dedicatedCashAccountNumber"
value="#{createController.modelFE.sacLink.dedicatedCashAccountNumber}"
validator="accountNumberValidator" />
就是这样。请注意,如果验证(或转换)失败,则不会调用JSF操作方法。也不需要非敏感的isError
混乱。