Java 如何在BeanioXML文件中引入可变日期格式?

Java 如何在BeanioXML文件中引入可变日期格式?,java,bean-io,Java,Bean Io,下面是我的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="Te

下面是我的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>

问题是,我需要由调用此xml文件的类动态设置“MM/dd/yyyy”来解析该文件。因为日期格式取决于用户设置


这可以通过某种方式实现吗?

应该可以,但肯定是一种黑客行为。首先,创建如下自定义类型处理程序:

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);
    }
}
包示例;
导入org.beanio.types.DateTypeHandler;
公共类ClientDateTypeHandler扩展了DateTypeHandler{
private static ThreadLocal datePattern=new ThreadLocal();
公共ClientDateTypeHandler(){
setPattern(datePattern.get());
}
公共静态void setDatePattern(字符串s){
datePattern.set(s);
}
}
然后在映射文件中注册类型处理程序:

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

最后,在使用StreamFactory加载映射文件之前,调用ClientDateTypeHandler.setDatePattern(…)

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

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

试试这个,它应该可以工作

在映射文件中为默认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;
}

}
import java.text.ParseException;
导入java.text.simpleDataFormat;
导入org.beanio.types.TypeConversionException;
导入org.beanio.types.TypeHandler;
导入com.google.common.base.Strings;
公共类TimestampHandler实现TypeHandler{
私有SimpleDataFormat dateFormat=新SimpleDataFormat(“MMddyyyy”);
@凌驾
公共对象解析(字符串文本)抛出TypeConversionException{
if(Strings.isNullOrEmpty(text)){
返回null;
}
试一试{
returndateformat.parse(文本);
}捕获(解析异常){
抛出新的TypeConversionException(ex);
}
}
@凌驾
公共字符串格式(对象值){
if(value==null | | value.toString().isEmpty()){
返回“”;
}
返回日期格式。格式(值);
}
@凌驾
公共类getType(){
返回java.sql.Timestamp.class;
}
}

我想您正在寻找
java.sql.Timestamp
to
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;
    }

}
导入java.sql.Timestamp;
导入java.util.Date;
导入org.beanio.types.DateTypeHandlerSupport;
导入org.beanio.types.TypeConversionException;
公共类TimestampTypeHandler扩展了DateTypeHandlerSupport{
公共TimestampTypeHandler(){}
公共TimestampTypeHandler(字符串模式){
超级(模式);
}
@凌驾
公共对象解析(字符串文本)抛出TypeConversionException{
if(text==null | | text.isEmpty()){
返回null;
}
返回新的时间戳(super.parseDate(text.getTime());
}
@凌驾
公共字符串格式(对象值){
Date dateTime=(值==null)?null:新日期((时间戳)值).getTime();
返回super.formatDate(dateTime);
}
@凌驾
公共类getType(){
返回Timestamp.class;
}
}
它的配置与其他类型处理程序一样简单:

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

以下是提供的单元测试: