如何在BeanIO xml文件中引入变量日期格式?

问题描述:

这里是我的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文件解析文件中的类动态设置。因为日期格式取决于用户设置。

这可以以某种方式完成吗?

该工作,但绝对是一个黑客。首先,创建一个自定义类型处理器是这​​样的:使用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); 
    } 
} 

然后注册类型处理程序映射文件加载你的映射文件。

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

试试这个,它应该工作。

在映射文件中定义默认DateTypeHandler的类型处理程序。

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

在您的字段上使用该处理程序。这就是你所需要的。

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

再举一个例子:

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; 
} 

} 

我想你正在寻找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