javascript
将Java 8日期时间API与JSF和Java EE 7结合使用
如果您將Java 8與Java EE 7一起使用,則在嘗試?yán)媚承㎎ava 8新功能時(shí)可能會(huì)遇到一些怪癖。 一個(gè)這樣的怪癖是,默認(rèn)情況下,新的Date-Time API不適用于許多Java EE 7 API,因?yàn)樗鼈兪菫榕cjava.util.Date和/或較早的Date API一起使用而構(gòu)建的。 但是,這并不是障礙,因?yàn)橛性S多方法可以解決此類問題。 在本文中,我將演示如何調(diào)整JSF應(yīng)用程序,以允許將Java 8 Date-Time API與JPA和日期轉(zhuǎn)換器一起使用。
首先,如果您希望使用新的LocalDate類(或Java 8 Date-Time API中的其他類)來保留日期,則需要開發(fā)一個(gè)轉(zhuǎn)換器,該轉(zhuǎn)換器將自動(dòng)從java.time.LocalDate轉(zhuǎn)換為java.util.Date ,反之亦然,以便與JPA 2.1一起使用。 這很容易做到,尤其是因?yàn)椴恍枰渲萌魏蝀ML即可建立轉(zhuǎn)換器。 以下代碼是用于為JPA提供Java 8 Date-Time支持的轉(zhuǎn)換器:
import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.Month; import java.time.ZoneId; import java.util.Date; import javax.persistence.AttributeConverter; import javax.persistence.Converter;/*** Converter to provide Java 8 Date/Time API Support to JPA* * @author Juneau*/ @Converter(autoApply = true) public class LocalDatePersistenceConverter implements AttributeConverter<LocalDate, Date> {@Overridepublic Date convertToDatabaseColumn(LocalDate entityValue) {LocalTime time = LocalTime.now();Instant instant = time.atDate(entityValue).atZone(ZoneId.systemDefault()).toInstant();return Date.from(instant);}@Overridepublic LocalDate convertToEntityAttribute(Date databaseValue) {Instant instant = Instant.ofEpochMilli(databaseValue.getTime());return LocalDateTime.ofInstant(instant, ZoneId.systemDefault()).toLocalDate();} } 查看代碼, convertToDatabaseColumn()方法接受一個(gè)
來自實(shí)體,類的LocalDate,然后利用某些Java 8 Date-Time API實(shí)用程序?qū)⑵滢D(zhuǎn)換為java.util.Date以便可以將其存儲(chǔ)到數(shù)據(jù)庫中。 第二種方法convertToEntityAttribute()從JPA中獲取一個(gè)java.util.Date并將其沿相反的方向轉(zhuǎn)換為LocalDate對(duì)象,以與基于Java 8的應(yīng)用程序一起使用。 @Converter批注將類注冊(cè)為轉(zhuǎn)換器,并且實(shí)現(xiàn)AttributeConverter將該轉(zhuǎn)換器應(yīng)用于實(shí)體類,以便將狀態(tài)轉(zhuǎn)換為數(shù)據(jù)庫列并再次轉(zhuǎn)換為該列。
接下來,如果您嘗試將JSF轉(zhuǎn)換器應(yīng)用于應(yīng)用程序中的Java 8 LocalDate ,例如在視圖中,則將遇到問題,除非您編寫特殊的FacesConverter實(shí)現(xiàn)以應(yīng)用于要轉(zhuǎn)換為LocalDate的組件。 編寫FacesConverter就像實(shí)體類屬性轉(zhuǎn)換器一樣簡單,注冊(cè)就像將注釋應(yīng)用到轉(zhuǎn)換器一樣容易。 下列類是FacesConverter的示例,該示例會(huì)將java.time.LocalDate轉(zhuǎn)換為java.util.Date以便在JSF組件中使用。
注意:這也適用于流行的JSF組件庫,例如PrimeFaces。
import java.time.LocalDate; import java.time.format.DateTimeFormatter; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; import javax.faces.convert.FacesConverter;/*** Faces converter for support of LocalDate* @author Juneau*/ @FacesConverter(value="localDateTimeConverter") public class LocalDateTimeConverter implements javax.faces.convert.Converter {@Overridepublic Object getAsObject(FacesContext context, UIComponent component, String value) {return LocalDate.parse(value);}@Overridepublic String getAsString(FacesContext context, UIComponent component, Object value) {LocalDate dateValue = (LocalDate) value;return dateValue.format(DateTimeFormatter.ofPattern("MM/dd/yyyy"));}} 現(xiàn)在讓我們看一下代碼。 這個(gè)FacesConverter類是通過@FacesConverter批注注冊(cè)的,并且該類可以簡單地實(shí)現(xiàn)javax.faces.convert.Converter接口。 接下來,看一下實(shí)現(xiàn)。 getAsObject()方法用于從組件中解析字符串,并將其作為java.time.LocalDate返回,而getAsString()方法接受LocalDate對(duì)象,并以指定的日期格式將其作為String返回。 這展示了Java 8的另一個(gè)不錯(cuò)的功能……
DateTimeFormatter類,可輕松格式化java.time.*對(duì)象。
就是這樣……在Java EE 7應(yīng)用程序中使用漂亮的Java 8 Date-Time API并不是太困難。 現(xiàn)在,將轉(zhuǎn)換器應(yīng)用于日期組件。 以下標(biāo)記演示了如何將轉(zhuǎn)換器應(yīng)用于PrimeFaces日歷組件。
<p:calendar id="enterDate" converter="localDateTimeConverter" style="width: 100%;"readonly="true" value="#{myExcellentJsfController.current.enterDate}"></p:calendar>翻譯自: https://www.javacodegeeks.com/2015/06/utilizing-the-java-8-date-time-api-with-jsf-and-java-ee-7.html
總結(jié)
以上是生活随笔為你收集整理的将Java 8日期时间API与JSF和Java EE 7结合使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: xml对象映射_将对象映射到多个XML模
- 下一篇: 反恐精英v5电脑版下载(反恐精英v5极限