OData4j 0.7检索工作项时出现异常

时间:2013-06-17 13:31:13

标签: java tfs2012 odata4j

我正在尝试使用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”而不是获取所有字段。 除非找到更好的解决方案,否则这是一个临时修复。

1 个答案:

答案 0 :(得分:0)

我想我想出来了。看看这篇文章:OData4J exception

基本上,归结为使用Edm.DateTime在C#代码中设置DateTime.Now列的值。 OData Producer应该使用DateTime。 UtcNow

DateTime.Now包含当地时区信息。 Microsoft的代码在DateTime结构中查看本地时区信息,并发回格式为Edm.DataTime字符串的Edm.DateTimeOffset字段。 DateTime.UtcNow属性不包含任何时区信息,因此在将其发送回OData使用者时,它被正确格式化为Edm.DateTim字符串。

我怀疑这可能是微软WCF数据服务堆栈或其实体框架中的错误。