如何在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.Timestamp
到java.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