f:convertDateTime支持Java8 LocalDate / LocalDateTime?

时间:2015-05-22 11:21:50

标签: java jsf java-8 jsf-2.2

JSF核心标记f:convertDateTime可以格式化java.util.Date个对象。 Date类有许多不推荐使用的方法,Java 8提供了新的类来显示本地日期和时间:LocalDateTimeLocalDate

f:convertDateTime无法格式化LocalDateTimeLocalDate

有没有人知道,如果有一个等价的JSF核心标记convertDateTime可以处理LocalDateTime对象?计划是为将来的版本提供支持,还是提供替代标签?

1 个答案:

答案 0 :(得分:5)

编写自己的转换器并扩展javax.faces.convert.DateTimeConverter - 这样您就可以重用<f:convertDateTime>支持的所有属性。它也会照顾本地化。不幸的是,编写带属性的转换器会有点复杂。

  1. 编写自己的扩展javax.faces.convert.DateTimeConverter的转换器 - 让超级调用完成所有工作(包括locale-stuff)并将结果从/转换为LocalDate。
  2. 
        @FacesConverter(value = LocalDateConverter.ID)
            public class LocalDateConverter extends DateTimeConverter {
              public static final String ID = "com.example.LocalDateConverter";
        	  
        	  @Override
        	  public Object getAsObject(FacesContext facesContext,
        	  		UIComponent uiComponent, String value) {
        	  	LocalDate ldate = null;
        	  	Date date = null;
        	  	Object o = super.getAsObject(facesContext, uiComponent, value);
        	  	 if(o == null) {
        			return null;
        		}
        	  	if (o instanceof Date) {
        	  		date = (Date) o;
        	  		Instant instant = Instant.ofEpochMilli(date.getTime());
        	  		ldate = LocalDateTime.ofInstant(instant, ZoneId.systemDefault()).toLocalDate();
        	  		return ldate;
        	  	}
        	  	else{
        	  		throw new IllegalArgumentException(String.format("value=%s could not be converted to a LocalDate, result super.getAsObject=%s",value,o));
        	  	}
        	  }
        	  
        	  @Override
        	  public String getAsString(FacesContext facesContext,
        	  		UIComponent uiComponent, Object value) {
        		if(value == null){
        			return super.getAsString(facesContext, uiComponent,value);
        		}
        	  	if (value instanceof LocalDate) {
        	  		LocalDate lDate = (LocalDate) value;
        	  		Instant instant = lDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant();
        	  		Date date = Date.from(instant);
        	  		return super.getAsString(facesContext, uiComponent,date);
        	  	}
        	  	else{
        	  		throw new IllegalArgumentException(String.format("value=%s is not a instanceof LocalDate",value));
        	  	}
        	  }
        	  
            }
    
    
    1. LocalDateConverter-taglib.xml中创建文件META-INF
    2. 
          <facelet-taglib version="2.2"
              xmlns="http://xmlns.jcp.org/xml/ns/javaee"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facelettaglibrary_2_2.xsd">
      
          <namespace>http://example.com/LocalDateConverter</namespace>
           <tag>
            <tag-name>convertLocalDate</tag-name>
            <converter>
             <converter-id>com.example.LocalDateConverter</converter-id>
            </converter>
           </tag>
          </facelet-taglib>
      
      
      1. web.xml
      2. 中注册该taglib
        
            <context-param>
             <param-name>facelets.LIBRARIES</param-name>
             <param-value>/META-INF/LocalDateConverter-taglib.xml</param-value>
            </context-param>
        
        
        1. 要在JSF页面中使用新标记,请添加新的Taglib xmlns:ldc="http://example.com/LocalDateConverter"
        2. 然后您可以使用标记<ldc:convertLocalDate type="both" dateStyle="full"/>