Регистрация  |  Вход

Date and Datetime variables + Remote Action in Salesforce

Привет.

Сегодня хочу поделиться своим наблюдением, которое забрало у меня из жизни больше половины дня и кучу нервных клеток.

Пришла мне очередная задача сделать красивую страницы на базе JS но уже под готовую бизнес логику на бэкенде. Задача заключалась в том чтобы гонять туда сюда монструозный DTO состоящий еще из кучи других DTO. Как бы задача звучит просто.

Начинаю делать самое простое - получить DTO и отправить DTO назад в SF.

Провал

Получить получаю, но отправляю назад и SF валится, причем с Internal Error ошибкой. Ладно бы делал бы сам бэкенд разобрался бы с тем что да страктура данных гоняется, так а тут для меня черный ящик.

Начинаю воспроизводить сериализацию и десериализацию на стороне sf без remote action. Благо появляется ошибка. Нахожу причину - в DTO есть одна переменная с типом SObject - вот она и не десериализируется.

Круто!

Обрадовался, пробую запустить прием и возврат DTO - опять облом. Ошибка говорит что у меня неверный формат даты для JSON.deserialize и показывает мне значение в unix timestamp формате.

Какого? Всю жизнь гонял через remote actions даты в этом формате и никаких проблем. Прошелся поиском по данным в запросе - 5 совпадений даты. Разные объектные поля содержат это значение и одна переменная из DTO. Начал с нее (удалил из запроса) и о чудо мой DTO вернулся в sf.

Что же за хрень с этой переменной типа Date. А вот какая хрень. Немного поигрался и нашел причину.
Если сериализировать и десериализировать переменную в JSON, то она принимает вид ISO 8601, т.е. работает нормально. А вот если пустить ее в remote action, то он вернет ее на js стороне в виде unix timestamp, а назад уже нифига не примет.

Вот такая вот подлянка от SF.

Лезть в бизнес логику на стороне SF и править DTO нельзя, придется на стороне SF вручную переводить формат этой переменной из unix в ISO 8601. Костыли!

чего так сделано, не понял. Может я что-то упустил простое.

Но самое интересное что Date и Datetime fields из SObject отлично принимают и парсят unix timestamp который приходит в Remote Action. Это получается что я все свои долгие годы тупо гонял даты внутри sobjecs, а не как отдельные переменные. Вот и случилась подлянка про которую я не знал и убил полдня.

Привет.

Сегодня хочу поделиться своим наблюдением, которое забрало у меня из жизни больше половины дня и кучу нервных клеток.

Пришла мне очередная задача сделать красивую страницы на базе JS но уже под готовую бизнес логику на бэкенде. Задача заключалась в том чтобы гонять туда сюда монструозный DTO состоящий еще из кучи других DTO. Как бы задача звучит просто. 

Начинаю делать самое простое - получить DTO и отправить DTO назад в SF. 

Провал

Получить получаю, но отправляю назад и SF валится, причем с Internal Error ошибкой. Ладно бы делал бы сам бэкенд разобрался бы с тем что да страктура данных гоняется, так а тут для меня черный ящик. 

Начинаю воспроизводить сериализацию и десериализацию на стороне sf без remote action. Благо появляется ошибка. Нахожу причину - в DTO есть одна переменная с типом SObject - вот она и не десериализируется.

Круто!

Обрадовался, пробую запустить прием и возврат DTO - опять облом. Ошибка говорит что у меня неверный формат даты для JSON.deserialize и показывает мне значение в unix timestamp формате.

Какого? Всю жизнь гонял через remote actions даты в этом формате и никаких проблем. Прошелся поиском по данным в запросе - 5 совпадений даты. Разные объектные поля содержат это значение и одна переменная из DTO. Начал с нее (удалил из запроса) и о чудо мой DTO вернулся в sf.

Что же за хрень с этой переменной типа Date. А вот какая хрень. Немного поигрался и нашел причину.
Если сериализировать и десериализировать переменную в JSON, то она принимает вид ISO 8601, т.е. работает нормально. А вот если пустить ее в remote action, то он вернет ее на js стороне в виде unix timestamp, а назад уже нифига не примет.

Вот такая вот подлянка от SF.

Лезть в бизнес логику на стороне SF и править DTO нельзя, придется на стороне SF вручную переводить формат этой переменной из unix в ISO 8601. Костыли!

чего так сделано, не понял. Может я что-то упустил простое. 

Но самое интересное что Date и Datetime fields из SObject отлично принимают и парсят unix timestamp который приходит в Remote Action. Это получается что я все свои долгие годы тупо гонял даты внутри sobjecs, а не как отдельные переменные. Вот и случилась подлянка про которую я не знал и убил полдня.

Я не знаю, может в Remote Action есть какая-нибудь настройка, чтобы передавать дату в нужном формате?
Очень кстати похоже на вот эту мою недавнюю проблему.
https://salesforce-developer.ru/forum/topic-remote-action-vozvraschaet-rezultat-s-html-entities

Я не знаю, может в Remote Action есть какая-нибудь настройка, чтобы передавать дату в нужном формате? 
Очень кстати похоже на вот эту мою недавнюю проблему.
https://salesforce-developer.ru/forum/topic-remote-action-vozvraschaet-rezultat-s-html-entities

Как выход пока вижу сериализацию в JSON перед отравкой на стороне контроллера. Хотя нафига эта двойная кодировка? Ну наверное вот для этого и нужна.

Потому что JSON.serialize != RemoteAction serialize

Как выход пока вижу сериализацию в JSON перед отравкой на стороне контроллера. Хотя нафига эта двойная кодировка? Ну наверное вот для этого и нужна.

Потому что JSON.serialize != RemoteAction serialize :(