EWS Java API 1.1 создает встречу - отсутствует TimeZoneDefinition

У меня есть Exchange Server 2007 с пакетом обновления 1 (SP1), и я хочу назначить встречу с помощью EWS Java API 1.1. У меня есть исключение, что я должен сначала установить определение часового пояса.

    appointment.setStartTimeZone(new TimeZoneDefinition(){{
        setName( "W. Europe Standard Time" );
    }}); 

Я попытался установить его напрямую, но получил это исключение:

The time zone definition is invalid or unsupported

Я видел некоторые обходные пути, когда вам нужно редактировать API Java (например, пропускать проверку TimeZoneDefinition), но, если это возможно, я не хочу вносить там какие-либо изменения. Я надеюсь, что кто-то знает, как правильно установить TimeZoneDefinition (без изменения базового API Java).

Изменить: в .NET кажется, что вы можете установить TimeZoneDefinition напрямую, например:

appointment.StartTimeZone = TimeZoneInfo.Local;

Но я не могу найти ничего подобного в Java API.


person user1414687    schedule 24.05.2012    source источник
comment
Я думаю, что ваш ответ находится в этой [теме] [1]. [1]: stackoverflow.com/questions/4133625/   -  person ahmeric    schedule 19.06.2012
comment
Возможно, это не тот совет, который вы ищете, но рассматривали ли вы использование веб-службы, доступной в Exchange 2007? Я обнаружил, что API, управляемый Java, очень ненадежный. msdn.microsoft.com/en-us/library /bb421489(v=exchg.80).aspx   -  person cdugga    schedule 15.11.2012


Ответы (1)


Я столкнулся с той же проблемой - и пробовал в основном все (кроме редактирования самого java ews api), чтобы встречи с StartTimeZone работали с Exchange 2007 SP1 в моем веб-приложении Spring - без успеха.

Я нашел такие комментарии: К сожалению, Exchange 2007 SP1 не поддерживает свойство StartTimeZone EWS. Если вы хотите использовать это свойство, вы должны использовать Exchange 2010. Я должен пойти, ищите менее «ненадежный» Java Exchange Framework.

Я был недоволен, и, поскольку я слышал, что во вселенной .NET такой проблемы нет, я решил пойти со следующим решением:

Я установил собственный сервер Nancy.

см. документацию по Нэнси

И написал простой NancyModule:

namespace WebServiceNancy
{
public class APIModul : NancyModule
{
    public APIModul() : base("/")
    {

        Post["/saveFooApp"] = _ =>
        {   
            var jsonApp = this.Bind<AppData>();
            string ewsURL = "https://saveFooApp/ews/exchange.asmx";
            System.Uri ewsUri = new System.Uri(ewsURL);

            ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1);
            service.Url = ewsUri;

            service.Credentials = new WebCredentials(jsonApp.Username, jsonApp.Password);

            Appointment app = new Appointment(service);
            app.Subject = jsonApp.Title;
            app.Start = jsonApp.Start;
            app.End = jsonApp.End;

            app.Save(WellKnownFolderName.Calendar);

            return Response.AsText("OK").WithStatusCode(HttpStatusCode.OK);
        };
    }
}


public class AppData
{
    public string Title { get; set; }
    public DateTime Start { get; set; }
    public DateTime End { get; set; }
    public string Username { get; set; }
    public string Password { get; set; }
}
}

Теперь я могу вызвать этот WS из моего контроллера Spring, передав свои данные о назначении в виде объекта json через RestTemplate:

SimpleDateFormat formatter = new  SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String startDate = formatter.format(fooMeeting.getMeetingStart());
String endDate = formatter.format(fooMeeting.getMeetingEnd());

JSONObject obj = new JSONObject();
obj.put("title", fooMeeting.getTitle());
obj.put("start", startDate);
obj.put("end", endDate);
obj.put("username", fooUser.getUsername());                 
obj.put("password", fooUser.getPassword());

RestTemplate rt = new RestTemplate();

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);

JSONSerializer jsonSer = new JSONSerializer();

HttpEntity<String> entity = new HttpEntity<String>(jsonSer.serialize(obj), headers);

ResponseEntity<String> response = rt.exchange("http://localhost:8282/saveFooApp", HttpMethod.POST, entity, String.class);               
System.out.println(response.getStatusCode());

Конечно, вам нужно решить, хотите ли вы использовать какое-то шифрование паролей при передаче учетных данных с одного сервера на другой, и как вы реализуете обработку ошибок.

  • но это работает как шарм для меня

  • и я очень уверен в будущих запросах, касающихся других функций EWS.

person user1386375    schedule 25.02.2016