日期类型混淆jsf

时间:2015-10-28 04:27:50

标签: date jsf

我偶然发现了一个奇怪的案子,想澄清我的困惑。 所以这就是问题所在,我正在使用带有Hibernate ORM的JPA,我有一些日期需要从数据库转换为更漂亮的显示 例如(2015-01-01至2015年1月)。 我写了这个方法:

public String convertDisplayDate(Date date) {
    int month = date.getMonth();
    String convertedDate = "";
    switch (month) {
    case 1:
        convertedDate += "January ";
        break;
    case 2:
        convertedDate += "February ";
        break;
    case 3:
        convertedDate += "March ";
        break;
    case 4:
        convertedDate += "April ";
        break;
    case 5:
        convertedDate += "May ";
        break;
    case 6:
        convertedDate += "June ";
        break;
    case 7:
        convertedDate += "July ";
        break;
    case 8:
        convertedDate += "August ";
        break;
    case 9:
        convertedDate += "September ";
        break;
    case 10:
        convertedDate += "October ";
        break;
    case 11:
        convertedDate += "November ";
        break;
    case 12:
        convertedDate += "December ";
        break;
    }
    convertedDate += String.valueOf(date).substring(0,4);
    return convertedDate;
}

我第一次以JSF形式调用它时工作:

#{candidateController.convertDisplayDate(candidateController.candidateDetail.preference.availableFrom)}

然而,问题发生在我再次打电话但是使用ui:repeat循环变量时:

#{candidateController.convertDisplayDate(e.fromTime)}

使用我的循环变量。 我有一个例外告诉我: noMethodFound:candidateController.convertDisplayDate(java.sql.Date),而我的签名是java.util.Date,我检查了所有实体都在java.util中使用相同的类Date。 所以我不得不为这些案例写一个新方法:

public String convertDisplaySQLDate(java.sql.Date date) {
    int month = date.getMonth();
    String convertedDate = "";
    switch (month) {
    case 1:
        convertedDate += "January ";
        break;
    case 2:
        convertedDate += "February ";
        break;
    case 3:
        convertedDate += "March ";
        break;
    case 4:
        convertedDate += "April ";
        break;
    case 5:
        convertedDate += "May ";
        break;
    case 6:
        convertedDate += "June ";
        break;
    case 7:
        convertedDate += "July ";
        break;
    case 8:
        convertedDate += "August ";
        break;
    case 9:
        convertedDate += "September ";
        break;
    case 10:
        convertedDate += "October ";
        break;
    case 11:
        convertedDate += "November ";
        break;
    case 12:
        convertedDate += "December ";
        break;
    }
    convertedDate += String.valueOf(date).substring(0,4);
    return convertedDate;
}

它的工作原理,但我需要知道为什么我得到这个异常,是因为ui:repeat日期以某种方式转换为java.sql.Date? 能不能给我一个解释和谢谢。

1 个答案:

答案 0 :(得分:4)

这不是由JSF引起的。这是由EL(负责解析和评估那些#{}事物的框架)引起的。在较旧的EL实现中,方法签名必须与参数类型完全匹配。它不检查超类。您最好的尝试是升级或替换正在使用的EL实现。

尽管如此,整个方法都是不必要的。扔掉那些维护不友好的垃圾,只使用内置日期转换器:

<h:outputText value="#{bean.date}">
    <f:convertDateTime pattern="MMMM yyyy" locale="en_US" />
</h:outputText>

就是这样。

它正在使用java.text.SimpleDateFormat。您可以在javadoc中找到模式。