Популяторы, преобразователи и концепция WsDTO в SAP Commerce (Hybris)

В этой статье мы поговорим об объектах передачи данных (DTO), конвертерах, популяторах и, наконец, о WsDTO.

При разработке пользовательских расширений в SAP Commerce (Hybris) вы будете часто внедрять в свой проект паттерн «Конвертеры и популяторы». Конвертеры и популяторы используются на уровне фасада для преобразования модели в данные. Мы вызываем методы конвертера для преобразования модели в данные.

Зачем они нужны?

Допустим, у нас есть таблица продуктов (ProductModel) в базе данных с 50 полями, но нам нужно 10 из них, чтобы вернуться во внешний интерфейс (UI). Мы вызываем нашу модель source, которая имеет все данные из базы данных, и мы вызываем target (DTO) структуру данных, которая является подмножеством источника модели и будет передана в UI. Мы используем преобразователи и популяторы для создания целевого DTO путем преобразования исходного объекта Model с использованием Populators для заполнения DTO.

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

Потому что в большинстве случаев нам нужно будет преобразовать нашу модель (в нашем случае Product) из нескольких мест. Мы конвертируем его на странице со списком продуктов, на странице с подробными сведениями о продукте, на странице подтверждения заказа. Поскольку мы следуем концепции ООП, было бы хорошо иметь отдельный класс, который будет выполнять это преобразование для нас, из всех этих мест.

Конвертер: создает новые экземпляры объектов данных и вызывает популяторы для заполнения данных. Он содержит список популяторов и использует популяторы для преобразования данных из источника в цель.

Populator: заполняет объект данных, получая данные из модели. Не рекомендуется вызывать populator прямо в коде. Логика преобразования существует в популяторах.

Шаги по определению преобразователей и популяторов (пример с ProductData):

1. Определение объекта передачи данных (DTO).

В ‹custom› fasades-beans.xml добавьте для создания нового свойства для ProductData (DTO) и построения системы hybris.

После успешной сборки мы можем проверить наш класс ProductData DTO (объект передачи данных) в указанном пакете и увидеть, что этот класс содержит наше новое свойство.

2. Определите конвертер в ‹custom› fasades-spring.xml.

Мы указываем, каков наш целевой объект (DTO, который мы хотим, чтобы наш Конвертер построил)

3. Определите Populator.

Популяторы реализуют интерфейс Populator ‹SOURCE, TARGET› и реализуют (переопределяют) метод заполнения.

Метод populate может быть таким же простым, как получение и установка значений из объекта модели (Source) в целевой (DTO) или вызов Services для получения дополнительных данных.

4. Вызов метода convertors convert внутри другого метода.

Мы вызываем скрытый метод конвертера или convertAll, который последовательно вызывает все популяторы, определенные для этого конвертера.

Концепция WsDTO

WsDTO - это уровень данных, используемый версией 2 REST API в OCC.

Модель WsDTO была введена SAP для повышения стабильности REST API за счет устранения зависимости от модели данных коммерческих сервисов. Изменения в модели коммерческих данных не влияют напрямую на REST API. Это также повышает гибкость, вводя механизм, который позволяет контролировать возвращаемые поля. В версии 2 REST API мы можем явно запрашивать заполнение определенных полей в объекте или использовать предопределенный набор полей.

В более старой версии REST API службы возвращают объекты данных, которые могут привести к неожиданному поведению при добавлении или изменении полей в модели данных коммерческих служб. Каждое изменение модели данных в коммерческих сервисах может повлиять на REST API и, как следствие, может повлиять на совместимость с потребителями сервиса.

Конфигурация динамического поля

Новый уровень WsDTO был представлен с новым механизмом, который позволяет нам определять поля, возвращаемые API. По умолчанию есть три конфигурации:

  • BASIC - заполняется только базовый набор полей, идентифицирующих объект.
  • ПО УМОЛЧАНИЮ - средний набор полей, определенных для наиболее распространенных вариантов использования.
  • ПОЛНЫЙ - возвращаются все поля.

Пример ProductWsDTO

<bean parent="fieldSetLevelMapping" id="productWsDTOFieldSetLevelMapping">
		<property name="dtoClass"
				  value="de.hybris.platform.commercewebservicescommons.dto.product.ProductWsDTO"/>
		<property name="levelMapping">
			<map>
				<entry key="BASIC"
					   value="purchasable,codeShort,stock,name,baseProduct,availableForPickup,code,url,price,description,images(DEFAULT),availableUnits,potentialPromotions(DEFAULT),summary"/>
				<entry key="DEFAULT"
					   value="code,codeShort,name,url,description,summary,favourite,baseProduct,availableUnits,baseUnit,price(DEFAULT),images(DEFAULT),potentialPromotions(DEFAULT),classifications(DEFAULT),breadcrumbs,crmProductInformations,promotion"/>
				<entry key="FULL"
					   value="code,summary,productReferences(FULL),classifications(FULL),averageRating,purchasable,volumePrices(FULL),variantType,stock(FULL),description,variantMatrix(FULL),codeShort,name,favourite,availableUnits,baseUnit,breadcrumbs,crmProductInformations,baseOptions(FULL),baseProduct,availableForPickup,variantOptions(FULL),reviews(FULL),code,url,price(FULL),numberOfReviews,manufacturer,volumePricesFlag,futureStocks(FULL),images(FULL),categories(FULL),potentialPromotions(FULL),priceRange,multidimensional"/>
			</map>
		</property>
	
</bean>

Каждый объект данных имеет свой аналог в WsDTO и соответствующее отображение. Все методы OCC REST API в версии 2 изменили свои сигнатуры, чтобы возвращать объекты WsDTO.

Выучить больше:

Https://help.sap.com/viewer/9d346683b0084da2938be8a285c0c27a/1905/en-US/8c8b49a186691014aface4015d79a338.html



Https://www.runhybris.com/2019/08/29/converters-and-populators-deep-dive/

Не забывайте аплодировать этому сообщению и подписывайтесь на мой блог, если вы сочтете его полезным.