Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 скала плей  [new]
andreykaT
Member

Откуда:
Сообщений: 1887
в общем есть простое мвс приложение...

ну какой то там контроллер какой то там сервис выдающий объект контроллеру, там в контроллере этот объект превращается в джейсон OK(Json.toJson(obj)) и возвращается клиенту. вроде всё банально.

теперь... у меня у этого obj есть поле х потому что он имплементит интерфейс, и мне в это поле что то надо положить. НО. я не хочу этого делать на уровне сервиса. это не его ума дело. я хочу это сделать где то либо между сервисом и контроллером либо между контроллером и клиентом.

т.е. как это в джаве сделать я представляю. ну там аспект в крайнем случае. интерцептор или на уровне сериализатора. а тут как лучше? ну или скажем так, правильнее?
8 фев 19, 15:49    [21804510]     Ответить | Цитировать Сообщить модератору
 Re: скала плей  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38039
andreykaT,
Правильнее формировать объект в одном месте. Либо разбить на два объекта.
Если хакнуть, то монопесуально где.
8 фев 19, 16:00    [21804527]     Ответить | Цитировать Сообщить модератору
 Re: скала плей  [new]
andreykaT
Member

Откуда:
Сообщений: 1887
возможно да. но там поле с техническими скажем так данными не имеющими отношения к сервису где забиваются поля скажем так бизнеслогики.
8 фев 19, 16:02    [21804533]     Ответить | Цитировать Сообщить модератору
 Re: скала плей  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5055
andreykaT, я про скалу\плей ничего не знаю, но хочу ответить ибо!
Вопрос ведь не в том, как правильно, а в том, почему это вдруг правильно? Если брать яву, то собирать нечто в json, на мой взгляд, лучше на уровне сервиса. Причина довольно проста - бывают доменные сущности у которых есть связи с другими сущностями и во время сбора потребуется эти связные сущности получить.

Чтобы дернуть эти связные сущности, по сути - надо либо их сразу загрузить(прощай LAZY LOAD), либо сделать повторный запрос к базе. Чтобы сделать повторный запрос, допустим, если вы используете хибер, вы либо не должны завершать предыдущую сеcсию, для чего в спринге была по умолчанию настройка(open-in-view, вроде), которая НЕ закрывала сессию после получения объекта и можно было дернуть lazy-load связные сущности. НУ и плохо во всем это то, что такие повторные запросы могут очень серьезено нагружать бд (проходят то они уже в ауткоммит моде и грузят диск, вроде как? Ну и вообще: обычная N+1 проблема тоже лишняя).

Потому, есть мнение, что правильно с точки зрения знаю-не-знаю ничего о том, какая нужна сущность на VIEW - по мне так под большим вопросом и требуется думать над плюсами и минусами.
8 фев 19, 16:12    [21804561]     Ответить | Цитировать Сообщить модератору
 Re: скала плей  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5055
А может так и вовсе DTO собирать сразу на уровне репозитория, тогда придется писать запросы руками, но этот путь - наиболее корректный.
8 фев 19, 16:14    [21804570]     Ответить | Цитировать Сообщить модератору
 Re: скала плей  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38039
andreykaT
возможно да. но там поле с техническими скажем так данными не имеющими отношения к сервису где забиваются поля скажем так бизнеслогики.
ты разве этим ответом пояснил почему все в одном классе?
Ты счас повторил что там данные не имеющие отношение к классу.
8 фев 19, 16:21    [21804580]     Ответить | Цитировать Сообщить модератору
 Re: скала плей  [new]
andreykaT
Member

Откуда:
Сообщений: 1887
Озверин, там можно еще дальше пойти - например на уровне контроллера сходить в базу и всё сразу там и сделать. тогда ни репы ни сервиса вообще не надо будет. а че и удобно и сразу под рукой ))

я как то делал похожее решение, ну оно было таким потому что мне сказали что хотят видеть его таким. так вот - решение заключалось в том, что на уровне фильтра ловился исходящий объект и там уже по интерфейсу вытаскивался и добавлялись нужные данные в поля.
8 фев 19, 16:24    [21804586]     Ответить | Цитировать Сообщить модератору
 Re: скала плей  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38039
andreykaT,
Если Модель кривая, можно и в фильтре доделать.
Можно даже в прокси доделать.
На любом участке пути следования.
8 фев 19, 16:28    [21804594]     Ответить | Цитировать Сообщить модератору
 Re: скала плей  [new]
andreykaT
Member

Откуда:
Сообщений: 1887
Petro123
andreykaT
возможно да. но там поле с техническими скажем так данными не имеющими отношения к сервису где забиваются поля скажем так бизнеслогики.
ты разве этим ответом пояснил почему все в одном классе?
Ты счас повторил что там данные не имеющие отношение к классу.

да. не имеющие прямого отношения к конкретно этому классу но которые надо отдать одновременно с объектом этого класса и которые зависят от этого класса.
8 фев 19, 16:30    [21804597]     Ответить | Цитировать Сообщить модератору
 Re: скала плей  [new]
andreykaT
Member

Откуда:
Сообщений: 1887
в общем, задача. у меня есть некий объект который я должен отдать юзеру. вместе с этим объектом я хочу отдать юзеру информацию о том что конкретно он может делать с этим объектом. она берется из другой таблицы. да там дозапрос. но это ничего страшного.

в итоге юзер получает объект джейсон где собссно сам объект с полями и еще дополнительное поле с объектом разрешений что конкретно этому юзеру можно с ним делать.

я такое делал на джаве и делал через интерцепторы. т.е. отлавливался объект смотрелось имплементит ли он нужный мне интерфейс и если да то уже потом вытряхивал из объекта его тип и ид и по этим двум параметрам вычислял что с ним делать можно тому кто его запросил.
8 фев 19, 16:33    [21804600]     Ответить | Цитировать Сообщить модератору
 Re: скала плей  [new]
andreykaT
Member

Откуда:
Сообщений: 1887
но джава спринг это джава спринг.

в плее я смотрю есть какие то экшены. пока не понял что это. либо может быть заимплементить свой сериализатор вместо джейсон.туджейсон (привет делегат или имплиситы) там посмотреть на объект поближе и добавить недостающее.
8 фев 19, 16:35    [21804606]     Ответить | Цитировать Сообщить модератору
 Re: скала плей  [new]
andreykaT
Member

Откуда:
Сообщений: 1887
почему я не хочу делать это в сервисе? потому что сервисов много. я хочу просто иметь какие то сущности и если они имеют нужный мне интерфейс - делать с ними доп.манипуляции при возврате клиенту.
8 фев 19, 16:37    [21804611]     Ответить | Цитировать Сообщить модератору
 Re: скала плей  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38039
andreykaT,
1000 экземпляров товаров и в каждый товар права что с ЭКЗЕМПЛЯРОМ делать можно?
8 фев 19, 16:38    [21804613]     Ответить | Цитировать Сообщить модератору
 Re: скала плей  [new]
andreykaT
Member

Откуда:
Сообщений: 1887
извини, не понял тебя.
8 фев 19, 16:40    [21804619]     Ответить | Цитировать Сообщить модератору
 Re: скала плей  [new]
mayton
Member

Откуда: loopback
Сообщений: 39933
Java/Scala сравнивать нельзя ИМХО. Здесь даже не доходя до плей. А еще на уровне обсуждения
способов как унаследовать или как что-то передать (на language-level) есть расхождения.
То что прокатывало в Scala может вообще не существовать в Java или реализовано не так.
8 фев 19, 16:42    [21804624]     Ответить | Цитировать Сообщить модератору
 Re: скала плей  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38039
andreykaT,
Пример бы привел.
Я знаю пример json где коллекция товаров идет на клиента.
Что у тебя непонятно.
8 фев 19, 16:43    [21804625]     Ответить | Цитировать Сообщить модератору
 Re: скала плей  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38039
mayton,
Ну да. Тут наверно про скалу сабж.
8 фев 19, 16:43    [21804627]     Ответить | Цитировать Сообщить модератору
 Re: скала плей  [new]
забыл ник
Member

Откуда:
Сообщений: 2617
Во-первых уже сказали, что объекты пермишенс и payload это разные объекты, и твой сервис должен возвращать только иммьютабл payload, а контроллер в целом может возвращать некий Wrapper(permissions:Set[_], payload: Any :< Result).

Теперь к боле важному вопросу, как же и где этот враппер создавать. Вообще, у меня к Play отношение скорее отрицательное чем положительное, на мой взгляд это какой-то выродок, посреди ООП и ФП, но тем не менее, канонически у этой задачи есть два пути решения.

1) https://www.playframework.com/documentation/2.6.x/ScalaHttpFilters - Тупо http-фильтры
2) Привязать к контроллеру akka-stream и сделать последним шагом вытягивание пермишенов и формирование враппера.

На самом деле ничего нового и неожиданного тут нет, все прозаично
8 фев 19, 16:55    [21804648]     Ответить | Цитировать Сообщить модератору
 Re: скала плей  [new]
andreykaT
Member

Откуда:
Сообщений: 1887
фильтр да.. и что с ним делать? ловить бади, оборачивать джейсон обратно в объект и доставлять ему дополнительные поля?
8 фев 19, 17:00    [21804664]     Ответить | Цитировать Сообщить модератору
 Re: скала плей  [new]
andreykaT
Member

Откуда:
Сообщений: 1887
акка стрим конечно брутально. ) ну тут есть еще вариант - допилить джейсон сериализатор чтоб он перед тем как сериализовать делал объекту обёртку).
8 фев 19, 17:02    [21804669]     Ответить | Цитировать Сообщить модератору
 Re: скала плей  [new]
andreykaT
Member

Откуда:
Сообщений: 1887
Petro123
andreykaT,
Пример бы привел.
Я знаю пример json где коллекция товаров идет на клиента.
Что у тебя непонятно.

аа. ты об этом. да. можно и так. если коллекция разнотипных объектов то к каждому прикреплять права. много шевелений да. но так надо.
8 фев 19, 17:39    [21804716]     Ответить | Цитировать Сообщить модератору
 Re: скала плей  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38039
andreykaT,
Если без скалы, то непонятно.
Вот ты взял коллекцию 100 об. Товар. И там где сделал доп запрос, добавил
class Товар{
Композиция class Права
... 

Сериализатор все это отправит.
8 фев 19, 18:54    [21804776]     Ответить | Цитировать Сообщить модератору
 Re: скала плей  [new]
andreykaT
Member

Откуда:
Сообщений: 1887
эээ а кто данные в объект класса права положит?? их же разрезолвить надо в отдельном месте и я не хочу это делать в том же сервисе который забивает товар.
8 фев 19, 18:56    [21804777]     Ответить | Цитировать Сообщить модератору
 Re: скала плей  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38039
andreykaT
эээ а кто данные в объект класса права положит?? их же разрезолвить надо в отдельном месте и я не хочу это делать в том же сервисе который забивает товар.

Пример:
Сущность - договора. И права это действия с договором. Тогда это бизнес логика. И должно быть в сервисе БЛ.
Сущность - договора. И права это роль юзверя. Тогда это не БЛ и юзверь берет права отдельным REST запросом. Хоть сразу на группу товаров, хоть коллекцией с айдишник-права.
Тебе решать.
Как будто один сервис у тебя не может вызвать второй независимый сервис.
8 фев 19, 19:24    [21804801]     Ответить | Цитировать Сообщить модератору
 Re: скала плей  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38039
andreykaT
разрезолвить
русских слов не хватает?
ЗЫ.
Не всегда на клиента отправляется сущность как она есть в базе.
Иногда ее нужно слепить в толстую бизнес сущность но без поведения. Только данные.
Почему вдруг права нужны, но положить внутрь некому и негде у тебя.
Может ты эти права сам придумал?
8 фев 19, 19:29    [21804811]     Ответить | Цитировать Сообщить модератору
 Re: скала плей  [new]
andreykaT
Member

Откуда:
Сообщений: 1887
вот еще делать мне больше нечего всякую дичь придумывать. права используются фронтендерами чтоб корректно отрисовать интерфейс без всяких там дозапросов. права не только крад но и кастомные.

ну в общем, еще как вариант вижу всё таки докручивать доп сервис и класть сущность в него, а он уже делает обертку, или тупо к джейсону прикручивает набор полей и возвращает респонз. топорно. но наверное, это лучшее. более прозрачно и неявно как это сделать я вариантов не вижу.

ну или снова имплиситы заюзать. и вместо Json.toJson(entity) сделать Json.toJsonWithAccessAttributes(entity) что в принципе тоже самое что сверху. подпорка.
8 фев 19, 22:21    [21804946]     Ответить | Цитировать Сообщить модератору
 Re: скала плей  [new]
dimonz80
Member

Откуда:
Сообщений: 189
andreykaT
вот еще делать мне больше нечего всякую дичь придумывать. права используются фронтендерами чтоб корректно отрисовать интерфейс без всяких там дозапросов. права не только крад но и кастомные.

ну в общем, еще как вариант вижу всё таки докручивать доп сервис и класть сущность в него, а он уже делает обертку, или тупо к джейсону прикручивает набор полей и возвращает респонз. топорно. но наверное, это лучшее. более прозрачно и неявно как это сделать я вариантов не вижу.

ну или снова имплиситы заюзать. и вместо Json.toJson(entity) сделать Json.toJsonWithAccessAttributes(entity) что в принципе тоже самое что сверху. подпорка.


Не пойму этих терзаний. Все правильно ИМХО описал. Если случай простой и единичный то модифицируем JSON перед отдачей клиенту, если что-то более-менее периодическое, то implicit classes вполне решение, к тому же изолированное и то модели и от контроллера, которое можно вынести в отделный пакадж и подключать по мере необходимости.
9 фев 19, 03:01    [21805036]     Ответить | Цитировать Сообщить модератору
 Re: скала плей  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38039
andreykaT
вот еще делать мне больше нечего всякую дичь придумывать.

тут имхо столкнулись паттерны статики динамики.
Я рассказал о классике Java и статике проектирования, но скала это динамика.
При обычном проектировании предпочтительнее заранее проектирование Модели и выше, выше по стеку до клиента.
При динамике ты вклиниваешься в процесс и добавляешь инфу (а ля рефлексия).
Ну а Скала:
автор
Scala богата выразительными средствами, за что ее и не любят опытные программисты на классических ООП-языках. Неявные параметры и преобразования — одна из самых спорных фич языка. Слово "неявные", уже как-бы намекает на что-то неочевидное и сбивающее с толку.

))
Ты так и не сказал в чём проблема, из твоего сервиса вызвать другой сервис чтобы полностью сформировать классы отправки.
Все решения хороши. Тебе решать.
IMHO
9 фев 19, 09:11    [21805074]     Ответить | Цитировать Сообщить модератору
 Re: скала плей  [new]
andreykaT
Member

Откуда:
Сообщений: 1887
да спасибо. сделал уже. просто сделал сервис прослойку который оборачивает джейсон нужными полями.

теперь другую хрень нашел в этой убогой скале.

оказвыается передать тип просто как в джаве нельзя. или я не понял как.

передаю объект по интерфейсу маркеру, потом серализатору говорю что это объект с типом Т, тип Т чуть выше через самого интерфейса передаю. а эта скотина говорит что для такого типа нету сериализатора. а он имплиситли есть.
если явно скастовать в тип через .асИнстансОф[НазваниеКласса] - то работает. если кастовать в Т -- то не работает хотя Т = НазваниеКласса.
это какой то гон. с джавы рефлексию чтоль подключить. или через паттерн матчинг кастовать. да бред какой то.

почему зная класс объекта, видя этот класс объекта я не могу в него скастовать средствами скалы???
10 фев 19, 22:56    [21805886]     Ответить | Цитировать Сообщить модератору
 Re: скала плей  [new]
mayton
Member

Откуда: loopback
Сообщений: 39933
Строгий вывод типов мать ево.
10 фев 19, 23:01    [21805892]     Ответить | Цитировать Сообщить модератору
 Re: скала плей  [new]
andreykaT
Member

Откуда:
Сообщений: 1887
я бы сказал что он очень строгий ))

значит я снова чот не то делаю. ладно, попробую зайти с другого края.
10 фев 19, 23:20    [21805903]     Ответить | Цитировать Сообщить модератору
 Re: скала плей  [new]
mayton
Member

Откуда: loopback
Сообщений: 39933
Вообще это принципы ФП. Они должны стоять выше чем возможности Java-рефлексии.

Хотя я возможно не совсем понял где ты что делаешь и как. Сорц бы помог.
10 фев 19, 23:23    [21805906]     Ответить | Цитировать Сообщить модератору
 Re: скала плей  [new]
dimonz80
Member

Откуда:
Сообщений: 189
andreykaT
да спасибо. сделал уже. просто сделал сервис прослойку который оборачивает джейсон нужными полями.

теперь другую хрень нашел в этой убогой скале.

оказвыается передать тип просто как в джаве нельзя. или я не понял как.

передаю объект по интерфейсу маркеру, потом серализатору говорю что это объект с типом Т, тип Т чуть выше через самого интерфейса передаю. а эта скотина говорит что для такого типа нету сериализатора. а он имплиситли есть.
если явно скастовать в тип через .асИнстансОф[НазваниеКласса] - то работает. если кастовать в Т -- то не работает хотя Т = НазваниеКласса.
это какой то гон. с джавы рефлексию чтоль подключить. или через паттерн матчинг кастовать. да бред какой то.

почему зная класс объекта, видя этот класс объекта я не могу в него скастовать средствами скалы???


Дык откуда известно про сериализатор для ХЗ какого типа Т во время компиляции? Если используешь play.api.libs.json, то сигнатура Json.toJson требует инмлиситный параметр Writes[T].

Json.toJson[T](o: T)(implicit tjs: Writes[T]): JsValue


вот и передавай своему методу тотже имплиситный параметр или указывай явно.
11 фев 19, 01:22    [21805962]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Java Ответить