java - JSF 表单中可选的日历类型字段

标签 java jsf jsf-2 calendar

我想将 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/

相关文章:

java - PrintWriter.printf 和 PrintWriter.format 方法之间的区别

java - NodeJS 连接到 Java Mongo 驱动程序

java - 阻止在控制台上打印 jsf 验证消息

java - 如何访问JEE6项目中的图片资源?

java - 为什么通用数组代码可以干净地编译?

java - GOOGLE_APPLICATION_CREDENTIALS 身份验证无法在远程 ubuntu 机器上运行

jsf - 如何展开treeTable的所有节点?

java - JSF 复合组件 : Implement selection

java - 如何保护 XHTML 文件不被编辑

java - Primefaces p :dataTable showing without message "No records found."?