我有一个包含多个字段的bean
@NotNull( message = "{ch.ethz.id.wai.doi.validation.doi.missingdoi}" )
@Pattern( regexp = "10\\.[\\d.]+/.*", message = "{ch.ethz.id.wai.doi.validation.doi.invalidDoi}" )
private String doi;
@ManyToOne
@NotNull( message = "{ch.ethz.id.wai.doi.validation.doi.missingpool}" )
private DoiPool doiPool;
第一个注释按预期工作,JSF中有以下内容
<h:inputText
id = "doi"
value = "#{detailModel.afterObject.doi}"
/>
<h:messages for="doi" style="clear: both; color: red;"/>
对于另一个字段,我有一个禁用的输入文本,其中我放置了引用对象的名称。用户可以通过单击按钮并在单独的视图中选择它来指定对象。
<h:inputText
id = "doiPool"
value = "#{detailModel.afterObject.doiPool.name}"
disabled = "true"
/>
<h:messages for="doiPool" style="clear: both; color: red;"/>
由于inputText
未引用detailModel.afterObject.doiPool
,但其名称没有任何反应。
即使无法使用输入字段直接编辑,如何强制detailModel.afterObject.doiPool
上的验证呢?
答案 0 :(得分:2)
在处理表单提交过程中会跳过已禁用的输入。
让disabled
属性在回发期间评估false
,而不是渲染响应。
<h:inputText ... disabled="#{not facesContext.postback or facesContext.renderResponse}" />
这样,它会在表单提交期间评估false
,从而包含在处理中。
答案 1 :(得分:1)
作为BalusC答案的补充:
@NotNull
在DoiPool
对象上指定,而不是他的名字(在文本字段中显示)。要使其工作,文本字段需要绑定到验证字段:
<h:inputText
id = "doiPool"
value = "#{detailModel.afterObject.doiPool}"
disabled = "#{facesContext.renderResponse}"
>
<f:converter converterId="ch.ethz.id.wai.doi.DoiPoolConverter"></f:converter>
</h:inputText>
转换器只返回对象的getName()
。
@FacesConverter( "ch.ethz.id.wai.doi.DoiPoolConverter" )
public class DoiPoolConverter implements Converter
{
/**
* This converter works only in the other direction.
*
* @return null
*/
@Override
public Object getAsObject( FacesContext facesContext, UIComponent uiComponent, String string )
{
return null;
}
@Override
public String getAsString( FacesContext facesContext, UIComponent uiComponent, Object object )
{
if ( object instanceof DoiPool )
{
return ( (DoiPool)object ).getName();
}
return null;
}
}