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

Java JSF表单中的可选日历类型字段,java,jsf,jsf-2,calendar,Java,Jsf,Jsf 2,Calendar,我想让JSF表单中的日历输入成为可选的。当用户未通知出生时,日历字段必须保持空 我的代码: @Model public class Registration { private User user = new User(); public void register() { // stuff } //getUser } public class User { //other fields private Calendar birth;

我想让JSF表单中的日历输入成为可选的。当用户未通知出生时,日历字段必须保持空

我的代码:

@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>
模型类:

@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>
页面:

@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>

到目前为止,这里的问题是
,它依赖于
Calendar
getTime()
方法来进行转换。它在执行时抛出一个NPE(空指针异常)。我知道,如果我初始化出生,问题就解决了,但我真的希望当用户不填写字段时,字段为空


有没有办法做到这一点的想法?

问题与转换无关,而是与表达式有关:

{registration.user.birth.time}

实际上,这是
DateTimeConverter
code:

 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;
  }

好吧,我会把这篇文章发给后人的。我认为这会起作用:

@FacesConverter("CustomCalendarConverter")
public class CalConverter implements Converter{

@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
    if(value != null && !value.toString().isEmpty()){
        try {
            String pattern = (String) component.getAttributes().get("pattern");
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(new SimpleDateFormat(pattern).parse(value));
            return calendar;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    return null;
}

@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {

    if(value != null && !value.toString().isEmpty()){
        Calendar cal = (Calendar) value;
        String pattern = (String) component.getAttributes().get("pattern");
        return new SimpleDateFormat(pattern).format(cal.getTime());
    }
        else return null;
    }
}
观点应该是:

<h:outputLabel for="birth" value="Birth Date" />
<h:inputText id="birth" value="#{registration.user.birth}">
    <f:converter converterId="CustomCalendarConverter" />
    <f:attribute name="pattern" value="dd/MM/yyyy" />
</h:inputText>


您也可以创建一个复合组件,例如

这是f:convertDateTime转换器的默认行为。如果字符串为null或空字符串,它将返回null,这是NPE的原因。您可以编写一个自定义转换器,它将提供一个日期值,如31-Jan-2999,这意味着用户输入的是null或空字符串。