Дизайн на REST отговор

29 views
Skip to first unread message

Trifon Trifonov

unread,
Feb 15, 2021, 5:37:53 PM2/15/21
to Bulgarian Java Users Group
Здравейте, колеги,

правя Spring приложение, което има следните REST ресурси
- /partners/{id}/orders - връща OrderDTO
- /partners/{id}/invoices - връща InvoiceDTO
- /partners/{id}/shipments - връща ShipmentDTO

За да улесня животът на потребителите на тези услуги искам да направя и
- /partners/{id}/all-documents - връща List<Object>
Това е списък с всички възможни документи, за даден партньор(partner), обаче...
Класовете OrderDTO, InvoiceDTO и ShipmentDTO нямат поле което да казва какъв е типът на даден запис(JSON обект), който ще върна в списъкът. Тоест клиентите на събирателният ресурс няма да могат да определят от кой тип е всеки запис.

Мога да добавя поле, но по този начин ще започна да замърсявам, моите класове с полета, които не са от домейнът. Всъщност аз имам други класове за домейнът(Order, Invoice, Shipment), мога да добавя новото поле само към DTO класовете и тогава ще замърся само DTO слоят.

Примема коментари и предложения...

Поздрави,
Трифон


damyan...@mail.bg

unread,
Feb 16, 2021, 12:45:35 AM2/16/21
to bg-...@googlegroups.com

Правиш ново DTO с 3 полета, които съдържат списъци с конкретните обекти:

public class DocumentsDTO{
    private List<OrderDTO> orders;
    private List<InvoiceDTO> invoices;
    private List<ShipmentDTO> shipments;
}

Така няма да зацапваш нито Entity, нито DTO слоя, нито ще се налага да switch-ваш логиката за обработка на база на някакво допълнително type поле.

----- Цитат от Trifon Trifonov (tri...@gmail.com), на 16.02.2021 в 00:37 -----

--
Получихте това съобщение, защото сте абонирани за групата „Bulgarian Java Users Group“ в Google Групи.
За да се отпишете от тази група и да престанете да получавате имейли от нея, изпратете имейл до bg-jug+un...@googlegroups.com.
За да видите тази дискусия в мрежата, посетете https://groups.google.com/d/msgid/bg-jug/e2fc7ef7-4454-4d21-a4a3-2e91d366a512n%40googlegroups.com.



-------------------------------------
Mail.bg дава 50 GB на всеки потребител! Работи от вкъщи!

Martin Grigorov

unread,
Feb 16, 2021, 3:51:14 AM2/16/21
to bg-...@googlegroups.com
On Tue, Feb 16, 2021 at 7:45 AM <damyan...@mail.bg> wrote:

Правиш ново DTO с 3 полета, които съдържат списъци с конкретните обекти:

public class DocumentsDTO{
    private List<OrderDTO> orders;
    private List<InvoiceDTO> invoices;
    private List<ShipmentDTO> shipments;
}

Така няма да зацапваш нито Entity, нито DTO слоя, нито ще се налага да switch-ваш логиката за обработка на база на някакво допълнително type поле.

+1 ^^

Така JSON-a ще е:
{
  "orders": [...],
  "invoices": [...],
  "shipments": [...] 
}
 


----- Цитат от Trifon Trifonov (tri...@gmail.com), на 16.02.2021 в 00:37 -----

Здравейте, колеги,

правя Spring приложение, което има следните REST ресурси
- /partners/{id}/orders - връща OrderDTO
- /partners/{id}/invoices - връща InvoiceDTO
- /partners/{id}/shipments - връща ShipmentDTO

За да улесня животът на потребителите на тези услуги искам да направя и
- /partners/{id}/all-documents - връща List<Object>
Това е списък с всички възможни документи, за даден партньор(partner), обаче...
Класовете OrderDTO, InvoiceDTO и ShipmentDTO нямат поле което да казва какъв е типът на даден запис(JSON обект), който ще върна в списъкът. Тоест клиентите на събирателният ресурс няма да могат да определят от кой тип е всеки запис.

Мога да добавя поле, но по този начин ще започна да замърсявам, моите класове с полета, които не са от домейнът. Всъщност аз имам други класове за домейнът(Order, Invoice, Shipment), мога да добавя новото поле само към DTO класовете и тогава ще замърся само DTO слоят.

Примема коментари и предложения...

Поздрави,
Трифон


--
Получихте това съобщение, защото сте абонирани за групата „Bulgarian Java Users Group“ в Google Групи.
За да се отпишете от тази група и да престанете да получавате имейли от нея, изпратете имейл до bg-jug+un...@googlegroups.com.
За да видите тази дискусия в мрежата, посетете https://groups.google.com/d/msgid/bg-jug/e2fc7ef7-4454-4d21-a4a3-2e91d366a512n%40googlegroups.com.



-------------------------------------
Mail.bg дава 50 GB на всеки потребител! Работи от вкъщи!

--
Получихте това съобщение, защото сте абонирани за групата „Bulgarian Java Users Group“ в Google Групи.
За да се отпишете от тази група и да престанете да получавате имейли от нея, изпратете имейл до bg-jug+un...@googlegroups.com.
За да видите тази дискусия в мрежата, посетете https://groups.google.com/d/msgid/bg-jug/3445e763fe35f0bc88701cc5e672b4ca.mailbg%40mail.bg.

Doychin Bondzhev

unread,
Feb 16, 2021, 4:33:29 AM2/16/21
to bg-...@googlegroups.com
Другия вариант е да използваш


Така, ще кажеш на Jackson да добдави самичък едно property към всеки сериализиран обект с информация за типа на обекта без да променяш DTO структурата.
--
Получихте това съобщение, защото сте абонирани за групата „Bulgarian Java Users Group“ в Google Групи.
За да се отпишете от тази група и да престанете да получавате имейли от нея, изпратете имейл до bg-jug+un...@googlegroups.com.
За да видите тази дискусия в мрежата, посетете https://groups.google.com/d/msgid/bg-jug/e2fc7ef7-4454-4d21-a4a3-2e91d366a512n%40googlegroups.com.


-- 
Doychin Bondzhev
dSoft-Bulgaria Ltd.
PowerPro - billing & provisioning solution for Service providers
http://www.dsoft-bg.com/
Mobile: +359888243116
doychin.vcf
Reply all
Reply to author
Forward
0 new messages