У меня есть сущность, которая получает userType во время запроса к базе данных.
public class OrderEntityXml {
@Id
@SequenceGenerator(name = "jpa.Sequence.t.order", sequenceName = "T_ORDER_SEQ", allocationSize = 1)
@GeneratedValue(generator = "jpa.Sequence.t.order", strategy = GenerationType.SEQUENCE)
private Long id;
private String customer;
@Type(type = "Order")
@Column(name = "order_xml")
private Order order;
public OrderEntityXml() {
}
Есть контейнер для получения от сущности.
Этот контейнер использует Джексон.
Этот контейнер также использует маршаллер и демаршаллер
@XmlRootElement
@JacksonXmlRootElement(localName = "order")
public class Order implements Serializable {
private String customer;
@XmlElement(name = "orderItem")
@JacksonXmlProperty(localName = "orderItem")
@JacksonXmlElementWrapper(useWrapping = false)
private List<OrderItem> orderItems = new ArrayList<>();
public Order() {
}
public class OrderItem {
private String sku;
private Double price;
public OrderItem() {
}
Я настроил MapStruct.
- CycleAvoidingMappingContext - (Это необходимо, чтобы избежать Цикл (и появление переполнения стека))
@Component
public class CycleAvoidingMappingContext {
private Map<Object, Object> knownInstances = new IdentityHashMap<Object, Object>();
@BeforeMapping
public <T> T getMappedInstance(Object source, @TargetType Class<T> targetType) {
T t = (T) knownInstances.get(source);
return t;
}
@BeforeMapping
public void storeMappedInstance(Object source, @MappingTarget Object target) {
knownInstances.put( source, target );
}
}
public interface CommonMapper<D, E> {
D toDto(E e, @Context CycleAvoidingMappingContext context);
E toEntity(D d, @Context CycleAvoidingMappingContext context);
Iterable<D> toListDto(Iterable<E> entityList);
Iterable<E> toListEntity(Iterable<D> dtoList);
}
- MapperUtils - (это утилиты для MapStruct)
public static Order convertToDto(OrderEntityXml orderEntityXml){
Order order = new Order();
String customer = orderEntityXml.getCustomer();
order.setCustomer(customer);
Order xmlOrder = orderEntityXml.getOrder();
List<OrderItem> orderItems = xmlOrder.getOrderItems();
order.setOrderItems(orderItems);
return order;
}
public static OrderEntityXml convertToEntity(Order order){
OrderEntityXml orderEntityXml = new OrderEntityXml();
String customer = order.getCustomer();
orderEntityXml.setCustomer(customer);
List<OrderItem> orderItems = order.getOrderItems();
Order orderInEntity = new Order();
orderInEntity.setOrderItems(orderItems);
orderInEntity.setCustomer(customer);
orderEntityXml.setOrder(orderInEntity);
return orderEntityXml;
}
- OrderDtoMapper - это базовый c интерфейс для меня, для генерации классов
@Mapper(componentModel = "spring")
public interface OrderDtoMapper extends CommonMapper<Order, OrderEntityXml> {
@Override
default Order toDto(OrderEntityXml orderEntityXml, CycleAvoidingMappingContext context) {
return convertToDto(orderEntityXml);
}
@Override
default OrderEntityXml toEntity(Order order, CycleAvoidingMappingContext context) {
return convertToEntity(order);
}
@Override
default Iterable<Order> toListDto(Iterable<OrderEntityXml> entityList) {
Iterable<Order> collect = StreamSupport.stream(entityList.spliterator(), false)
.map(MapperUtils::convertToDto)
.collect(Collectors.toList());
return collect;
}
}
Для каждого типа данных вам придется создавать свои собственные утилиты, а это громоздко.
Могу ли я удалить лишний код и настроить его через интерфейсы MapStruct? Я подозреваю, что усложнил код.
Может ли кто-нибудь сказать вам, что нужно настроить или какую технологию можно применить к mapStruct, чтобы сделать код унифицированным