事象 : f:convertDateTimeを使ったらエラーになった
- 環境
- CentOS Linux release 7.8.2003 (Core)
- Eclipse IDE for Enterprise Java Developers.Version: 2020-03 (4.15.0)
- openjdk version "11.0.7" 2020-04-14 LTS
- JSF 2.3.9
java.text.ParseException: Unparseable date: "sampleBean.timestamp"
at java.base/java.text.DateFormat.parse(DateFormat.java:395)
at javax.faces.convert.DateTimeConverter$FormatWrapper.parse(DateTimeConverter.java:489)
at javax.faces.convert.DateTimeConverter$FormatWrapper.access$100(DateTimeConverter.java:470)
at javax.faces.convert.DateTimeConverter.getAsObject(DateTimeConverter.java:437)
at com.sun.faces.facelets.tag.jsf.ConverterTagHandlerDelegateImpl.applyAttachedObject(ConverterTagHandlerDelegateImpl.java:120)
at javax.faces.view.facelets.FaceletsAttachedObjectHandler.applyAttachedObject(FaceletsAttachedObjectHandler.java:60)
at com.sun.faces.facelets.tag.jsf.ConverterTagHandlerDelegateImpl.apply(ConverterTagHandlerDelegateImpl.java:53)
at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:111)
at javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137)
at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:179)
...省略...
原因 : h:outputTextのvalue属性を#{}で囲むのを忘れた
-
f:convertDateTime
から(convertDateTime(JSF 2.2 View Declaration Language: JSP Variant)) -
javax.faces.convert.DateTimeConverter#getAsObject
が呼ばれて(DateTimeConverter | JavaServer Faces API (2.2)) -
javax.faces.convert.DateTimeConverter.FormatWrapper#parse
が呼ばれて(DateTimeConverter.FormatWrapper (Mojarra Implementation Javadoc (2.3))) -
java.text.DateFormat#parse
でParseException
になる - 理由には「 指定された文字列の先頭が解析できない場合。」とある(DateFormat (Java Platform SE 8))
バカっぽいけどよくやる自分がいる
<h:outputText value="sampleBean.timestamp">
<f:convertDateTime pattern="yyyy-MM-dd" timeZone="Japan"/>
</h:outputText>
対応 : EL式はちゃんと#{}で囲む
<h:outputText value="#{sampleBean.timestamp}">
<f:convertDateTime pattern="yyyy-MM-dd" timeZone="Japan"/>
</h:outputText>