обновление бульдозера до mapstruct - PullRequest
0 голосов
/ 09 июня 2018

Я использую dozer в своем приложении для отображения бина на бин ... из-за его уязвимостей я хочу перейти на mapstruct

В dozer у нас была одна функция отображения для бина на бинотображение и это делает отображение для всех различных экземпляров.

В MapStruct я не могу достичь с помощью одного и того же метода.

import java.util.Map;
import org.dozer.DozerBeanMapper;
import org.dozer.MappingException;

/**
 * Factory for creating DTO objects based on the object identifier that
 * is passed to the object creation method.
 */
public class RetrieveChangeSetObjectDtoFactory {
    private Map<String, String> objectIdentifiers;  
    private DozerBeanMapper beanMapper;

    public Object createDto(String objectIdentifier, Persistence srcObject) throws MappingException, ClassNotFoundException {
        String className = objectIdentifiers.get(objectIdentifier);

        if (className == null) {
            return null;
        }

        return beanMapper.map(srcObject, Class.forName(className));
    }

    /**
     * Setter for the object identifiers map, maps the domain objects to their associated DTO classes.
     * 
     * @param objectIdentifiers object identifiers map
     */
    public void setObjectIdentifiers(Map<String, String> objectIdentifiers) {
        this.objectIdentifiers = objectIdentifiers;
    }

    /**
     * Setter for the bean mapper.
     * 
     * @param beanMapper bean mapper (dozer)
     */
    public void setBeanMapper(DozerBeanMapper beanMapper) {
        this.beanMapper = beanMapper;
    }
}

beanmapper.map это отображение объектов для меня ... объектыполучение сопоставления через загрузку bean-компонента hashmap

хочу иметь один и тот же метод для сопоставления всех объектов, хранящихся в hashmap

enter image description here

Это мойПружина Dozer

1 Ответ

0 голосов
/ 11 июня 2018

Важным отличием 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);
    }
}

Тем не менее, я бы порекомендовал просто ввести нужные вам картографы вместо того, чтобы делать что-то настолько общее.

...