схема Джексона / JSON - замена ISO8601Utils внешним модулем генератора схемы JSON - PullRequest
0 голосов
/ 19 февраля 2019

Я заменяю ISO8601Utils, который прокомментирован ниже из-за того, что SonarQube выдает следующую ошибку: Remove this use of "ISO8601Utils"; it is deprecated. Чтобы заменить его, я бы использовал внешний генератор генератора схемы json, https://github.com/FasterXML/jackson-module-jsonSchema или что-то еще.Я прочитал ссылку, но не понимаю, как использовать объектный сопоставитель для поворота, чтобы заменить эту строку: String value = ISO8601Utils.format(date, true);

    public static class ISO8601DateFormat extends DateFormat {

    public ISO8601DateFormat() {}

    public StringBuffer format(Date date, StringBuffer toAppendTo,
            FieldPosition fieldPosition) {
        String value = ISO8601Utils.format(date, true);
        //Im not sure how I can replace this line with a new
        //replacement

        toAppendTo.append(value);
        return toAppendTo;
    }

    public Date parse(String source, ParsePosition pos) {
        pos.setIndex(source.length());
        return ISODateTimeFormat.dateTimeParser().parseDateTime(source).toDate();
    }

    public Object clone() {
        return this;
    }

    public String toString() {
        return this.getClass().getName();
    }
}

Любая помощь будет принята с благодарностью!

PS IЯ пишу модульный тест, чтобы убедиться, что ISO8601Utils и SimpleDateFormat имеют одинаковый формат.

Мой обновленный класс:

    public static class ISO8601DateFormat extends DateFormat {

    public static final long serialVersionUID = 3549786448500970210L;

    public ISO8601DateFormat() {}

    @Override
    public StringBuffer format(Date date, StringBuffer toAppendTo,
            FieldPosition fieldPosition) {
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
        String value = dateFormat.format(date);
        toAppendTo.append(value);
        return toAppendTo;
    }

    public Date parse(String source, ParsePosition pos) {
        pos.setIndex(source.length());
        return ISODateTimeFormat.dateTimeParser().parseDateTime(source).toDate();
    }

    public Object clone() {
        return this;
    }

    public String toString() {
        return this.getClass().getName();
    }
}

Мой метод тестирования:

  @Test
    public void testDateFormat() {
     df = new DefaultHttpClientUtil.ISO8601DateFormat();
     Date date = new Date();
     //df.setTimeZone(TimeZone.getTimeZone("GMT")); I'm getting NPE   
     for this line

    assertThat(df.format(date)).isEqualTo(ISO8601Utils.format(date, 
    true));
  }

Тем не менее, я получаю исключение нулевого указателя для закомментированной строки.Я предполагаю, что это связано с инъекцией или издевательством над объектом, но я не уверен, как мне решить эту проблему.

1 Ответ

0 голосов
/ 19 февраля 2019

ISO8601DateFormat и ISO8601Utils устарели с версии 2.9 и не предоставляют четкой документации, что делать после того, как она устарела.Был вопрос на GitHub: ISO8601DateFormat устарела, но замена неясна связана с вашим вопросом.

Я полагаю, что кто-то из вашей команды просто использовал первый класс, который, как он обнаружил, сериализовал формат Date в ISO8601, и не обратил большого внимания на то, что это происходит из библиотеки Jackson.Я рекомендую не использовать внутренние *Utils классы из библиотек, которые вы используете по другой причине.В этом случае для serialising / deserialising JSON.Прямо сейчас у нас есть много вариантов форматирования дат, и вы должны выбрать один для вас.В основном это зависит от того, какую JDK версию вы используете.

Итак, вместо:

String value = ISO8601Utils.format(date, true);

Используйте, например, SimpleDateFormat:

DateFormat df2 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");

Как вы можете видеть ниже, пример печатает одну и ту же дату в обоих случаях:

import com.fasterxml.jackson.databind.util.ISO8601Utils;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class JsonApp {

    public static void main(String[] args) throws Exception {
        Date date = new Date();
        DateFormat df2 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
        df2.setTimeZone(TimeZone.getTimeZone("GMT"));

        System.out.println(ISO8601Utils.format(date, true));
        System.out.println(df2.format(date));
    }
}

Выше кода печатается:

2019-02-19T19:37:14.809Z
2019-02-19T19:37:14.809Z

Второй параметр ISO8601Utils.format равен true, что означает, что вам нужны миллисекунды в результате, а формат должен выглядеть как yyyy-MM-ddThh:mm:ss.sss'Z'.

Для получения дополнительной информации читайте:

  1. Преобразование строки, соответствующей ISO 8601, в java.util.Date
  2. Как преобразовать времяв формате ГГГГ-ММ-ДДЧЧ: мм: сс.SSSZ с часовым поясом по умолчанию?
...