我想将 JSF 表单中的日历输入设为可选。当用户没有通知出生时,Calendar 字段必须保持为空。
我的代码:
@Model
public class Registration {
private User user = new User();
public void register() {
// stuff
}
//getUser
}
模型类:
public class User {
//other fields
private Calendar birth;
// gets and sets
}
页面:
<h:outputLabel for="birth" value="Birth Date" />
<h:inputText id="birth" value="#{registration.user.birth.time}" >
<f:convertDateTime pattern="dd/MM/yyyy" />
</h:inputText>
到目前为止,这里的问题是 <f:convertDateTime>
,这取决于getTime()
方法Calendar
进行转换。执行时会抛出NPE(空指针异常)。我知道如果我初始化出生问题就解决了,但我真的希望当用户未填写该字段时该字段为空。
有什么办法可以实现这个目标吗?
最佳答案
问题与转换无关,而是与表达式有关:
#{registration.user.birth.time}
事实上这是DateTimeConverter
代码:
public Object getAsObject(FacesContext context, UIComponent component,
String value) {
...
Object returnValue = null;
DateFormat parser = null;
try {
// If the specified value is null or zero-length, return null
if (value == null) {
return (null);
}
value = value.trim();
if (value.length() < 1) {
return (null);
}
...
returnValue = parser.parse(value);
} catch (ParseException e) {
...
}
return returnValue;
}
正如您所注意到的,空值和空值得到了正确的管理。
但是当应用这些值时,表达式 birth.time
已评估,但 birth
引用为 null,因此当准时调用 setter 时,您会得到 NPE。
一个可能的解决方案是绑定(bind) birth
字段至 java.util.Date
直接输入,这是 DateTimeConverter
管理的类型,如下:
public class User {
//other fields
private Date birth;
// gets and sets
}
关于java - JSF 表单中可选的日历类型字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22361354/