1

Java で OData4j 0.7 を使用して、TFS サーバーからワークアイテムを取得しようとしています。

これが私のコードです:

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)

コードをさらにデバッグすると、TFS サーバーから取得した日付をマップしようとすると、OData4j が互換性がないことがわかりました。

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」を選択する選択クエリを指定しました。より良い解決策が見つからない限り、これは一時的な修正です。

4

1 に答える 1

0

私はこれを理解したと思います。この投稿をチェックしてください: OData4J 例外

Edm.DateTime基本的には、C# コードを使用して列の値を設定することになりますDateTime.Now。OData プロデューサは DateTime を使用する必要があります。UtcNow

DateTime.Nowローカル タイム ゾーン情報が含まれます。Microsoft のコードは、DateTime 構造体でローカル タイム ゾーン情報を確認し、文字列Edm.DataTimeとしてフォーマットされたフィールドを返しEdm.DateTimeOffsetます。このプロパティにはタイム ゾーン情報が含まれていないため、OData コンシューマに送り返されるときに e 文字列DateTime.UtcNowとして正しくフォーマットされます。Edm.DateTim

これは、Microsoft の WCF Data Services スタックまたは Entity Framework のバグであると思われます。

于 2013-08-28T01:23:55.653 に答える