Важным отличием MapStruct от Dozer является то, что MapStruct является инструментом обработки аннотаций, что означает, что он генерирует код.Вам нужно будет создать интерфейсы / сопоставления, которые будут генерировать необходимый код сопоставления.
MapStruct не имеет единой точки входа, которая выполняет общее сопоставление.Однако вы можете реализовать что-то подобное на своей стороне, если хотите.
Вам потребуется базовый интерфейс, который будут реализованы всеми вашими мапперами
public interface BaseMapper<S, T> {
T toDto(S source);
S toEntity(T target);
}
Затем вам нужно будет реализоватьваш RetrieveChangeSetObjectDtoFactory
немного по-другому.
public class RetrieveChangeSetObjectDtoFactory {
private Map<Class<?>, Map<Class<?>, BaseMapper<?, ?>>> entityDtoMappers = new HashMap<>();
public <S, T> Object createDto(Class<S> entityClass, Class<T> dtoClass, S source) {
if (source == null) {
return null;
}
return getMapper(entityClass, dtoClass).toDto(source);
}
public <S, T> Object createSource(Class<S> entityClass, Class<T> dtoClass, T dto) {
if (dto == null) {
return null;
}
return getMapper(entityClass, dtoClass).toEntity(dto);
}
@SuppressWarnings("unchecked")
protected <S, T> BaseMapper<S, T> getMapper(Class<S> entityClass, Class<T> dtoClass) {
// appropriate checks
return (BaseMapper<S, T>) entityDtoMappers.get(entityClass).get(dtoClass);
}
public <S, T> void registerMapper(Class<S> entityClass, Class<T> dtoClass, BaseMapper<S, T> mapper) {
entityDtoMappers.computeIfAbsent(entityClass, key -> new HashMap<>()).put(dtoClass, mapper);
}
}
Тем не менее, я бы порекомендовал просто ввести нужные вам картографы вместо того, чтобы делать что-то настолько общее.