OData4j 0,7 Исключение при получении рабочих элементов

Я пытаюсь получить рабочие элементы с TFS Server, используя OData4j 0.7 в Java.

Вот мой код:

public List<TFSWorkItem> getWorkItems(final String projectName)  
{
    final List<TFSWorkItem> tfsWorkItems = new ArrayList<TFSWorkItem>();
    String filter = String.format("Project eq '%s'", projectName);
    Enumerable<OEntity> workItems = consumer.getEntities("WorkItems").filter(filter).execute();
    for (OEntity workitem : workItems)
    {
        System.out.println(workitem.getProperty("Title", String.class));
    }
}

Когда я запускаю этот код, я получаю

Exception in thread "main" java.lang.IllegalArgumentException: Illegal datetime format 2013-03-15T14:22:08.077+05:30
at org.odata4j.internal.InternalUtil.parseDateTimeFromXml(InternalUtil.java:96)

При дальнейшей отладке кода я обнаружил, что OData4j при попытке сопоставить полученную дату с TFS-сервера находит ее несовместимой.

Дата получения из TFS:

2013-03-15T14:22:08.077+05:30

Дата, ожидаемая OData4j:

2013-03-15T14:22:08.077

Есть ли способ, где я могу избежать этого?

обновленный

Для тех, кто сталкивается с той же проблемой.

Я изменил свой код для:

    final String fields = "Id,Project,Title";
    Enumerable<OEntity> workItems = consumer.getEntities("WorkItems").filter(filter).select(fields.toString()).execute();
    for (OEntity workitem : workItems)
    {
        System.out.println("Id : " + workitem.getProperty("Id").getValue());
        System.out.println("Project : "+workitem.getProperty("Project").getValue());
        System.out.println("Title : "+workitem.getProperty("Title").getValue());
    }

Поскольку мне нужны только эти поля для обработки, я дал запрос на выбор, чтобы выбрать "Id","Project" и "Title" вместо выборки всех полей. Это временное исправление, если я не найду лучшего решения.

1 ответ

Я думаю, что я понял это. Проверьте это сообщение: исключение OData4J

В основном, это сводится к установке значения Edm.DateTime столбец в коде C# с помощью DateTime.Now, Производитель OData должен использовать DateTime.UtcNow.

DateTime.Now включает в себя информацию о местном часовом поясе. Код Microsoft видит информацию о часовом поясе в структуре DateTime и отправляет обратно Edm.DataTime поле отформатировано как Edm.DateTimeOffset строка. DateTime.UtcNow свойство не содержит никакой информации о часовом поясе, поэтому оно правильно отформатировано как Edm.DateTimстрока, когда она отправляется обратно потребителю OData.

Я подозреваю, что это может быть ошибка в стеке служб данных WCF от Microsoft или их Entity Framework.

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