2013-06-17 7 views
1

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

Вот мой код:

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», «Проект» и «Title» вместо извлечения всех полей , Это временное исправление, если я не найду лучшего решения.

ответ

0

Я думаю, что я понял это. Отметьте этот пост: OData4J exception

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

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

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