<f:attribute name="id"> 在 javax.faces.component.UIComponent.setValueExpression 处抛出 java.lang.IllegalArgumentException
<f:attribute name="id"> throws java.lang.IllegalArgumentException at javax.faces.component.UIComponent.setValueExpression
我有一个 select 一个菜单,其中有一个验证器,如下所示:
<h:selectOneMenu value="#{planning.formuleCremation}"
converter="#{formuleCremationConverter}"
validator="#{PlanningSalleAppareilFormuleCremationValidator}">
<f:selectItems value="#{beanPlanningSalleAppareil.formules}"
var="formule"
itemLabel="#{formule.alias}"
itemValue="#{formule}" />
<f:attribute name="id" value="#{planning.id}" />
</h:selectOneMenu>
我正在尝试使用 selectOneMenu 传递属性,以便我可以在 PlanningSalleAppareilFormuleCremationValidator
中检索它,如下所示:
public void validate(FacesContext fc, UIComponent uic, Object o) throws ValidatorException {
//Retrieve the attribute id passed with the current component
int id = (int) uic.getAttributes().get("id");
Object selectedObject = null;
//Current Planning
PlanningSalleAppareil planningSalleAppareil = planningSalleAppareilService.trouver(id);
if(planningSalleAppareil.getAppareil() != null)
selectedObject = planningSalleAppareil.getAppareil();
if(planningSalleAppareil.getSalle() != null)
selectedObject = planningSalleAppareil.getSalle();
planningSalleAppareil.setFormuleCremation((FormuleCremation) o);
if(selectedObject != null){
String errorMessage = planningSalleAppareilService.validPlanningSalleAppareil(planningSalleAppareil,selectedObject);
if(!errorMessage.equals("1")){
FacesMessage msg = new FacesMessage(errorMessage);
msg.setSeverity(FacesMessage.SEVERITY_ERROR);
throw new ValidatorException(msg);
}
}
}
但这行不通,它让我很困惑:java.lang.IllegalArgumentException at javax.faces.component.UIComponent.setValueExpression
当我仅将 <f:attribute name="id" value="#{planning.id}" />
添加到 selectOneMenu 时出现此错误,否则验证器正在运行。
我该如何解决这个问题?
有效,
<h:selectOneMenu ...>
<f:attribute name="id" value="#{planning.id}" />
...
</h:selectOneMenu>
与
完全相同
<h:selectOneMenu id="#{planning.id}" ...>
...
</h:selectOneMenu>
这种方法的问题是 JSF 不允许将呈现时间值表达式设置为组件的 id
属性。此外,您最好不要 override/reuse 用于 different/internal 目的的标准 JSF 组件属性。
将其重命名为其他名称,例如planningId
.
<f:attribute name="planningId" ... />
我有一个 select 一个菜单,其中有一个验证器,如下所示:
<h:selectOneMenu value="#{planning.formuleCremation}"
converter="#{formuleCremationConverter}"
validator="#{PlanningSalleAppareilFormuleCremationValidator}">
<f:selectItems value="#{beanPlanningSalleAppareil.formules}"
var="formule"
itemLabel="#{formule.alias}"
itemValue="#{formule}" />
<f:attribute name="id" value="#{planning.id}" />
</h:selectOneMenu>
我正在尝试使用 selectOneMenu 传递属性,以便我可以在 PlanningSalleAppareilFormuleCremationValidator
中检索它,如下所示:
public void validate(FacesContext fc, UIComponent uic, Object o) throws ValidatorException {
//Retrieve the attribute id passed with the current component
int id = (int) uic.getAttributes().get("id");
Object selectedObject = null;
//Current Planning
PlanningSalleAppareil planningSalleAppareil = planningSalleAppareilService.trouver(id);
if(planningSalleAppareil.getAppareil() != null)
selectedObject = planningSalleAppareil.getAppareil();
if(planningSalleAppareil.getSalle() != null)
selectedObject = planningSalleAppareil.getSalle();
planningSalleAppareil.setFormuleCremation((FormuleCremation) o);
if(selectedObject != null){
String errorMessage = planningSalleAppareilService.validPlanningSalleAppareil(planningSalleAppareil,selectedObject);
if(!errorMessage.equals("1")){
FacesMessage msg = new FacesMessage(errorMessage);
msg.setSeverity(FacesMessage.SEVERITY_ERROR);
throw new ValidatorException(msg);
}
}
}
但这行不通,它让我很困惑:java.lang.IllegalArgumentException at javax.faces.component.UIComponent.setValueExpression
当我仅将 <f:attribute name="id" value="#{planning.id}" />
添加到 selectOneMenu 时出现此错误,否则验证器正在运行。
我该如何解决这个问题?
有效,
<h:selectOneMenu ...>
<f:attribute name="id" value="#{planning.id}" />
...
</h:selectOneMenu>
与
完全相同<h:selectOneMenu id="#{planning.id}" ...>
...
</h:selectOneMenu>
这种方法的问题是 JSF 不允许将呈现时间值表达式设置为组件的 id
属性。此外,您最好不要 override/reuse 用于 different/internal 目的的标准 JSF 组件属性。
将其重命名为其他名称,例如planningId
.
<f:attribute name="planningId" ... />