axis2 xsd: проблема с форматом даты

У меня есть WSDL следующим образом:

< xsd:simpleType name="USER_ACT_STRDT_TypeDef">
  < xsd:annotation>
 < xsd:documentation>USER_ACT_STRDT is a date.< /xsd:documentation>
  < /xsd:annotation>
  < xsd:restriction base="xsd:date">
    < xsd:pattern value="(\d{4}-\d{2}-\d{2})"/>
  < /xsd:restriction>
< /xsd:simpleType>

Когда я генерирую STUB (используя Axis2 1.5.3), сгенерированная заглушка (привязка данных ADB) имеет следующий исходный код:

public void setUSER_ACT_STRDT_TypeDef(Date param) {

if (ConverterUtil.convertToString(param).matches("\d{4}-\d{2}-\d{2}")) {

this.localUSER_ACT_STRDT_TypeDef=param; } else { throw new java.lang.RuntimeException();
} }

Этот метод всегда генерирует исключение RuntimeException, поскольку метод ConverterUtil.convertToString() возвращает строку в формате, отличном от "гггг-мм-дд". Он возвращает дату, добавляя +5.30 как 2011-03-21+05:30.

Я пытался передать дату в разных форматах, но результат был одинаковым для всех.

Может кто подскажет как решить эту проблему.


person axis2binduser    schedule 23.03.2011    source источник
comment
Добро пожаловать в Stack Overflow! повторно задавать один и тот же вопрос здесь неприемлемо. Если вы хотите привлечь внимание к своему вопросу, вам будет разрешено назначить вознаграждение за него через два дня. Вы также можете отредактировать свой вопрос, чтобы добавить дополнительную информацию, которая может облегчить понимание вашего вопроса и ответ на него.   -  person    schedule 24.03.2011
comment
Кроме того, я объединил два ваших аккаунта вместе. Пожалуйста, прочитайте эту запись часто задаваемых вопросов об учетных записях на основе файлов cookie..   -  person    schedule 24.03.2011


Ответы (1)


Этот код:

if (ConverterUtil.convertToString(param).matches("\\d{4}-\\d{2}-\\d{2}"))

будет работать только с одним из доступных представлений даты. В спецификации даты WSDL вы обнаружите, что 2011-03-21+05:30 также является правильным представлением даты, это просто включите часовой пояс как +5 часов и 30 минут смещения к UTC.

Axis2 по умолчанию генерирует даты с часовым поясом, но должна иметь возможность работать с другими форматами дат.

Чтобы проверить, начинается ли строка с даты YYYY-MM-DD, вы можете использовать такой код:

if (! sd.matches("\\d{4}-\\d{2}-\\d{2}.*"))
    throw new ParseException("Something is terribly wrong with date: " + sd, 0);
else
    {
    sd = sd.substring(0, 10);
    System.out.println("ok: '" + sd + "'");
    }

PS Вы избегаете \d как \\d?

PPS Зачем кидаете RuntimeException? Есть гораздо «лучшие» исключения, такие как ParseException (используется методами анализа даты JDK) или IllegalArgumentException (используется библиотекой времени joda)

person Michał Niklas    schedule 29.03.2011