JaxbDateSerializer XmlAdapter - случайная проблема преобразования даты

У меня есть случайная проблема преобразования даты с приложением Java. Я использую класс JaxbDateSerializer, который расширяет XmlAdapter для декодирования строковой даты

import javax.xml.bind.annotation.adapters.XmlAdapter;

/**
 * Adapts a Date for custom marshaling.
 *
 */

public class JaxbDateSerializer extends XmlAdapter<String, Date> {
/**
 * le format yyyyMMddHHmmss
 */
public static final SimpleDateFormat DATE_TIME_FORMAT = new SimpleDateFormat("yyyyMMddHHmmss");

/**
 * le format yyyyMMdd
 */
public static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyyMMdd");

@Override
public String marshal(Date date) {
    return DATE_TIME_FORMAT.format(date);
}

Другой класс вызывается для обработки каждой строки этого файла, и я сравниваю дату, возвращаемую для проверки, если это в будущем или нет, чтобы вызвать предупреждение

    /*
 * (non-Javadoc)
 * @see com.afone.rdn.traitement.TraitementTransverse#setActivite(int, java.util.Date, int)
 */
@Override
public void setActiviteNumero(ActiviteNumero activiteNumero) throws RdnTraitementException {

    LOGGER.debug("TraitementTransverseImpl setActivite pour " + activiteNumero.getNumero() + " >> ("
            + activiteNumero.getDate() + ") traffic entrant: " + activiteNumero.getEntrantSortant());

    Timestamp time = null;
    if (activiteNumero.getDate() != null) {
        time = new Timestamp(activiteNumero.getDate().getTime());
    }
    com.afone.rdn.entities.Numero numeroActivite = new com.afone.rdn.entities.Numero(activiteNumero.getNumero(), time,
            activiteNumero.getEntrantSortant());
    try {
        com.afone.rdn.entities.Numero numeroTmp = numeroDAO.getNumero(numeroActivite.getNumero());
        if (!time.after(new Date((new java.util.Date()).getTime()))) {
            if (null == numeroTmp) {
                numeroDAO.mettreAJourNumero(numeroActivite);
            } else if ((null != numeroTmp.getDateDernierTrafic())
                    && (numeroTmp.getDateDernierTrafic().before(numeroActivite.getDateDernierTrafic()))) {
                numeroDAO.mettreAJourNumero(numeroActivite);
            }
        } else {
            LOGGER.warn("TraitementTransverseImpl setActivite date incorrecte numero: " + activiteNumero.getNumero()
                    + " date " + activiteNumero.getDate());
        }
    } catch (RdnTechniqueDaoException daoE) {
        throw new RdnTechniqueTraitementException(daoE);
    }
}

Верблюд получает CSV-файл и обрабатывает каждую строку, но мы получаем несколько случайных ошибок о недействительных датах, таких как эта:

2015-04-09 00: 34: 43,906 ПРЕДУПРЕЖДЕНИЕ [TraitementTransverseImpl:setActiviteNumero] TraitementTransverseImpl setActivite дата неверная цифра: 299999999 дата пт 28 августа 11:06:28 CEST 2015

Я не знаю, как найти проблему.

С уважением, Людовик

1 ответ

Наиболее вероятной причиной такого поведения являются следующие строки:

public static final SimpleDateFormat DATE_TIME_FORMAT = new SimpleDateFormat("yyyyMMddHHmmss");
...
public static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyyMMdd");

Объекты java.text.DateFormat не являются потокобезопасными.

Вы должны создать новые экземпляры этих локальных для вашего marshall метод.

@Override
public String marshal(Date date) {
    return new SimpleDateFormat("yyyyMMddHHmmss").format(date);
}
Другие вопросы по тегам