OfficeDev / ews-java-api

A java client library to access Exchange web services. The API works against Office 365 Exchange Online as well as on premises Exchange.
MIT License
870 stars 560 forks source link

Date String not in valid UTC/local format #237

Open serious6 opened 9 years ago

serious6 commented 9 years ago

Hi I am facing an issue while getting the getPasswordExpirationDate(..). The following is triggering the error:

ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP2);
service.setUrl(URI.create("..."));
ExchangeCredentials credentials = new WebCredentials("...", "...");
service.setCredentials(credentials);
System.out.println(service.getPasswordExpirationDate("...").toString());

Thats the stacktrace:

Exception in thread "main" microsoft.exchange.webservices.data.ServiceRequestException: The request failed. Date String 2015-04-20T11:10:13.851504Z not in valid UTC/local format
    at microsoft.exchange.webservices.data.SimpleServiceRequestBase.internalExecute(SimpleServiceRequestBase.java:70)
    at microsoft.exchange.webservices.data.GetPasswordExpirationDateRequest.execute(GetPasswordExpirationDateRequest.java:91)
    at microsoft.exchange.webservices.data.ExchangeService.getPasswordExpirationDate(ExchangeService.java:1634)
    at Connector.connect(Connector.java:43)
    at Connector.main(Connector.java:21)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
Caused by: java.lang.IllegalArgumentException: Date String 2015-04-20T11:10:13.851504Z not in valid UTC/local format
    at microsoft.exchange.webservices.data.util.DateTimeParser.parseInternal(DateTimeParser.java:98)
    at microsoft.exchange.webservices.data.util.DateTimeParser.convertDateTimeStringToDate(DateTimeParser.java:59)
    at microsoft.exchange.webservices.data.EwsServiceXmlReader.readElementValueAsDateTime(EwsServiceXmlReader.java:140)
    at microsoft.exchange.webservices.data.GetPasswordExpirationDateResponse.readElementsFromXml(GetPasswordExpirationDateResponse.java:44)
    at microsoft.exchange.webservices.data.ServiceResponse.loadFromXml(ServiceResponse.java:121)
    at microsoft.exchange.webservices.data.GetPasswordExpirationDateRequest.parseResponse(GetPasswordExpirationDateRequest.java:72)
    at microsoft.exchange.webservices.data.GetPasswordExpirationDateRequest.parseResponse(GetPasswordExpirationDateRequest.java:27)
    at microsoft.exchange.webservices.data.ServiceRequestBase.readResponse(ServiceRequestBase.java:458)
    at microsoft.exchange.webservices.data.ServiceRequestBase.readResponse(ServiceRequestBase.java:417)
    at microsoft.exchange.webservices.data.SimpleServiceRequestBase.internalExecute(SimpleServiceRequestBase.java:59)
    ... 9 more
serious6 commented 9 years ago

@evpaassen maybe DateTimeParser is missing another DateTimeFormat?

evpaassen commented 9 years ago

The DateTimeParser doesn't support this format (6 decimals) yet, apparently. Should be easy to add the pattern, but I'm curious which formats EWS could return. Perhaps we should take a little more sophisticated approach which ignores all decimals, because trying a large number of patterns on every parse could be a performance killer.