在我faces-config.xml
我已经设置
<context-param>
<param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
<param-value>true</param-value>
</context-param>
因此,与没有输入的任意输入组件放置一个null
成结合到value="#{myBean.someDate}"
属性bean属性,并从该bean属性获取null
时呈现一个空组件。
虽然这通常是应用程序的通缉行为,我有,我想用一个自定义的null
值来代替non null
特定组件。
有没有达到这个一般的好办法?
我曾尝试本作的Primefaces(6.2)日历钻嘴鱼科2.3.8:
<h:form id="myForm">
<p:calendar value="#{myBean.someDate}" pattern="MM/dd/yyyy"
converter="mySpecialDateConverter" locale="en" />
<p:commandButton value="send" process="@form" update="@form" />
<hr />
<h:outputText value="#{myBean.someDate}" />
</h:form>
我试了一下使用而呈现组件当从empty String
收到我的自定义值返回getAsString()
的#{myBean.someDate}
转换器,或getAsObject()
或纯emptyness提交时在null
吐出我的自定义值:
import java.util.Date;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.DateTimeConverter;
import javax.faces.convert.FacesConverter;
@FacesConverter("mySpecialDateConverter")
public class MyConverter extends DateTimeConverter {
private static final Date PAST = new Date(0);
public MyConverter() {
setPattern("MM/dd/yyyy");
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
if (PAST.equals(value)) {
return "";
}
return super.getAsString(context, component, value);
}
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
if (null == value || "".equals(value.trim())) {
return PAST;
}
return super.getAsObject(context, component, value);
}
}
渲染空日历组件时bean属性等于PAST
按预期工作。但提交压延无需输入设置为null
因为Primefaces CalendarRenderer
根本不征询空白值提交Converter
属性:
package org.primefaces.component.calendar;
public class CalendarRenderer extends InputRenderer {
// ...
public Object getConvertedValue(FacesContext context, UIComponent component, Object value) throws ConverterException {
Calendar calendar = (Calendar) component;
String submittedValue = (String) value;
SimpleDateFormat format = null;
if (isValueBlank(submittedValue)) {
return null;
}
//Delegate to user supplied converter if defined
try {
Converter converter = calendar.getConverter();
if (converter != null) {
return converter.getAsObject(context, calendar, submittedValue);
}
}
// ...
}
// ...
}
这部分是好的,作为Converter.getAsObject()
的JavaDoc说:
/**
* @return <code>null</code> if the value to convert is <code>null</code>,
* otherwise the result of the conversion
*/
这样的事,没有理由Primefaces解决在空的输入转换器。将不同恕我直言,如果我们想设置javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL = false
。然后我会考虑上述行为不正确的,因为""
不null
。
为了完整,这是我的豆又名myBean
:
import java.io.Serializable;
import java.util.Date;
import javax.faces.view.ViewScoped;
import javax.inject.Named;
@Named
@ViewScoped
public class MyBean implements Serializable {
private static final long serialVersionUID = 1L;
private Date someDate;
public Date getSomeDate() {
return someDate;
}
public void setSomeDate(Date someDate) {
this.someDate = someDate;
}
}
我不想让尽可能在实际应用中的日历值绑定到坚持实体属性值的变化对这个bean。我也不想持久层做的工作。
非常背景:
我想,以防止某些数据库null
领域DATE
值。在例如时期的情况下,我想一开始默认的一些遥远的过去的日期在应用程序上下文不相关的,在该期间的最后,我想在不远的将来在应用程序上下文中没有不相关的两个日期打扰其历史用户他们是在默认情况下。这些默认日期帮助过滤实体,其目前的Date
是否拉出那个时期,而假定用户没有输入是几乎期间for ever
。
JSF组件不会叫一个空值或任何他们认为是空的转换 - 这是在JSF的默认组件也是如此。所以在这方面我想如预期,这是正确的结果PrimeFaces的行为。以下是这规避,可以立即浮现在脑海中的两种方式;
正如JSF converter with null value描述,OmniFaces o:param
会打电话给你的转换器,无论空值的 - 你可以用它来传递参数给组件。在特定情况下,你应该能够做同样的事情到这一点;
<h:form id="myForm">
<p:calendar value="#{myBean.someDate}" pattern="MM/dd/yyyy" locale="en" />
<p:commandButton value="send" process="@form" update="@form">
<o:param name="date" value="#{myBean.someDateConversion}"
converter="mySpecialDateConverter" />
</p:commandButton>
<hr />
<h:outputText value="#{myBean.someDate}" />
</h:form>
第二个选择是使用自定义的渲染,只是修改组件的行为总是调用转换器,在这个答案所描述的 - JSF Custom Converter not called on null value。