Как ввести переменное форматирование даты в XML-файле BeanIO? - PullRequest
2 голосов
/ 02 марта 2012

Вот мой конфигурационный файл 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-файл, для анализафайл.Поскольку формат даты зависит от настроек пользователя.

Можно ли это как-то сделать?

Ответы [ 4 ]

4 голосов
/ 02 марта 2013

Попробуйте, это должно работать.

Определение обработчика типа для DateTypeHandler по умолчанию в файле сопоставления.

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

Используйте этот обработчик на вашем поле. Это все, что вам нужно.

<field name="transactionDate" typeHandler="dateTypeHandler" format="MM/dd/yyyy"/>
3 голосов
/ 03 марта 2012

Должно работать, но это определенно хак. Сначала создайте обработчик пользовательского типа, например так:

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

Затем зарегистрируйте обработчик типа в вашем файле отображения:

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

И, наконец, вызовите ClientDateTypeHandler.setDatePattern (...) перед использованием StreamFactory для загрузки файла сопоставления.

Интересный случай использования, я не думал об этом.

1 голос
/ 25 июня 2015

Еще один пример:

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 голосов
/ 05 апреля 2017

Полагаю, вы ищете обработчик от 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>

Вот примерный тест: Суть для TimestampTypeHandlerTest

...