2012-03-02 57 views
2

這裏是我的BeanIO xml配置文件:如何在BeanIO xml文件中引入變量日期格式?

<beanio xmlns="http://www.beanio.org/2011/01" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.beanio.org/2011/01 http://www.beanio.org/2011/01 /mapping.xsd"> 
    <stream name="Test" format="delimited"> 
    <record name="TestRow" minOccurs="1" maxOccurs="unbounded" class="com.company.TestRow"> 
     <field name="transactionDate" type="date" format="MM/dd/yyyy"/> 
     <field name="userId" type="string"/> 
     <field name="clientName" type="string"/> 
    </record> 
    </stream> 
</beanio> 

與它的問題是,我需要的「MM/DD/YYYY」通過調用此XML文件解析文件中的類動態設置。因爲日期格式取決於用戶設置。

這可以以某種方式完成嗎?

回答

3

該工作,但絕對是一個黑客。首先,創建一個自定義類型處理器是這​​樣的:使用StreamFactory前

<typeHandler type="java.util.Date" class="example.ClientDateTypeHandler" /> 

最後,調用ClientDateTypeHandler.setDatePattern(...):

package example; 
import org.beanio.types.DateTypeHandler; 

public class ClientDateTypeHandler extends DateTypeHandler { 
    private static ThreadLocal<String> datePattern = new ThreadLocal<String>(); 

    public ClientDateTypeHandler() { 
     setPattern(datePattern.get()); 
    } 

    public static void setDatePattern(String s) { 
     datePattern.set(s); 
    } 
} 

然後註冊類型處理程序映射文件加載你的映射文件。

有趣的用例,我沒有想到。

4

試試這個,它應該工作。

在映射文件中定義默認DateTypeHandler的類型處理程序。

<typeHandler name="dateTypeHandler" class="org.beanio.types.DateTypeHandler" /> 

在您的字段上使用該處理程序。這就是你所需要的。

<field name="transactionDate" typeHandler="dateTypeHandler" format="MM/dd/yyyy"/> 
1

再舉一個例子:

import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import org.beanio.types.TypeConversionException; 
import org.beanio.types.TypeHandler; 

import com.google.common.base.Strings; 

public class TimestampHandler implements TypeHandler { 
private SimpleDateFormat dateFormat = new SimpleDateFormat("MMddyyyy"); 

@Override 
public Object parse(String text) throws TypeConversionException { 
    if (Strings.isNullOrEmpty(text)) { 
     return null; 
    } 
    try { 
     return dateFormat.parse(text); 
    } catch (ParseException ex) { 
     throw new TypeConversionException(ex); 
    } 
} 

@Override 
public String format(Object value) { 
    if (value == null || value.toString().isEmpty()) { 
     return ""; 
    } 
    return dateFormat.format(value); 
} 

@Override 
public Class<?> getType() { 
    return java.sql.Timestamp.class; 
} 

} 
0

我想你正在尋找java.sql.Timestampjava.lang.String處理程序。一點點的清潔器版本:

import java.sql.Timestamp; 
import java.util.Date; 

import org.beanio.types.DateTypeHandlerSupport; 
import org.beanio.types.TypeConversionException; 

public class TimestampTypeHandler extends DateTypeHandlerSupport { 

    public TimestampTypeHandler() { } 

    public TimestampTypeHandler(String pattern) { 
     super(pattern); 
    } 

    @Override 
    public Object parse(String text) throws TypeConversionException { 
     if (text == null || text.isEmpty()) { 
      return null; 
     } 
     return new Timestamp(super.parseDate(text).getTime()); 
    } 

    @Override 
    public String format(Object value) { 
     Date dateTime = (value == null) ? null : new Date(((Timestamp)value).getTime()); 
     return super.formatDate(dateTime); 
    } 

    @Override 
    public Class<?> getType() { 
     return Timestamp.class; 
    } 

} 

配置,因爲這是最簡單的作爲如其它類型的處理程序:

<typeHandler type="java.sql.Timestamp" class="TimestampTypeHandler"> 
    <property name="pattern" value="MM/dd/yyyy" /> 
</typeHandler> 

這裏是單元測試提供: Gist for TimestampTypeHandlerTest