Преобразовать java.sql.Date в класс javax.xml.datatype.XMLGregorianCalendar

У меня есть сценарий, где я должен конвертировать java.sql.Date к классу javax.xml.datatype.XMLGregorianCalendar и я попробовал следующее

GregorianCalendar cal = new GregorianCalendar();
cal.setTime(financialTransactionProcessDataObj.invReceivedDate);
DatatypeFactory dTF = DatatypeFactory.newInstance();
XMLGregorianCalendar date = dTF.newXMLGregorianCalendar(cal);

я получаю

java.lang.SecurityException: Restricted method invocation. для DatatypeFactory

Есть ли другой способ сделать это?

1 ответ

Я предполагаю, что ваш желаемый результат XMLGregorianCalendar лайк 2018-06-30T00:00:00.000+02:00 (по крайней мере, это результат, который я получаю при запуске вашего кода на моем компьютере (это работает)).

Этот ответ также предполагает, что вы получаете java.sql.Date из базы данных SQL, и что вы хотите, чтобы ваш XMLGregorianCalendar для String что вы получаете от его toXMLFormat метод. Если это так, я полагаю, что вам тоже не нужно java.sql.Date ни XMLGregorianCalendar (вот так).

Чтобы получить дату из набора результатов:

    LocalDate invReceivedDate = yourResultSet.getObject("inv_receive_date", LocalDate.class);

Я не проверял код, и вы, конечно, должны заменить правильную метку столбца вместо inv_receive_date, При использовании JPA современная версия может дать вам LocalDate объект тоже.

Чтобы получить вашу строку для XML:

    OffsetDateTime date = invReceivedDate.atStartOfDay(ZoneId.systemDefault())
            .toOffsetDateTime();
    System.out.println(date.toString());

В моем тестовом прогоне это напечатано

2018-06-30T00:00+02:00

Если вы сравните со строкой, которую я получил от date.toXMLFormat() раньше вы заметите, что секунды и доли секунды не печатаются. Это, наверное, хорошо. Формат - ISO 8601, и в соответствии с этим стандартные секунды и доли секунды являются необязательными, поэтому оставьте их, когда они равны 0, должны работать. Если у вас есть особые требования для их включения, вы можете использовать

    DateTimeFormatter formatterForXml
            = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSxxx");
    System.out.println(date.format(formatterForXml));

На этот раз вывод

2018-06-30T00:00:00.000+02:00

Точно так же, как от date.toXMLFormat() до. Также возможно, что вам нужна только дата без учета времени суток и смещения UTC. Если так, то все еще проще:

    System.out.println(invReceivedDate.toString());

Выход:

2018-06-30

Зачем? Не только потому, что это работает. java.sql.Date давно устарел и плохо спроектирован, так что не используйте его. Вместо этого я использую LocalDate из java.time, современного Java API даты и времени. С современным API гораздо приятнее работать.

Ссылка: Oracle, учебник: Дата и время, объясняющие, как использовать java.time,

Другие вопросы по тегам