Привет.
Сегодня хочу поделиться своим наблюдением, которое забрало у меня из жизни больше половины дня и кучу нервных клеток.
Пришла мне очередная задача сделать красивую страницы на базе 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 :(