1

我有以下类层次结构:

public class BaseFaultType
{
    protected String faultId;
    protected String faultDescription;
    protected String faultDetail;

    ... -> setters and getters
}

public class PollingFaultType extends BaseFaultType
{
    protected Integer initiatedFiles;
    protected Integer failedFiles;
    ... -> getters and setters
}

public class StoreFaultType extends BaseFaultType
{
    protected String storePath;
    ... -> getters and setters
}

...

有一个 BaseFaultType 具有一些公共属性(为简单起见,我省略了其中的大部分),然后我有多种类型,它们使用附加属性扩展了 BaseFaultType。

请注意,我无法控制这些课程。

我的应用程序接收这些子类型的对象。然后我需要将这些对象映射到不同类型的实体中,即:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = EntityConstants.ERROR)
public class FaultMessage
{
    private String errorId;
    private String errorDescription;
    private String errorDetail;
    private Boolean retryable;
    ... -> getters and setters
}

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = EntityConstants.POLLING_MESSAGE)
public class PollingFaultMessage extends FaultMessage
{
    private Integer failed;
    private Integer initiated;
    ... -> getters and setters
}

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = EntityConstants.STORE_MESSAGE)
public class StoreFaultMessage 
{
    ...
}

我正在使用 ModelMapper 来完成这项工作。请注意,我使用的 ModelMapper 配置了禁用的隐式映射(出于对此问题不感兴趣的原因):

mapper.getConfiguration().setImplicitMappingEnabled(false);
mapper.addMappings(new PropertyMap<BaseFaultType, FaultMessage>()
        {
            @Override
            protected void configure()
            {
                map(source.getFaultId()).setErrorId(null);
                map(source.getFaultDescription()).setErrorDescription(null);
                ...
            }
        });
mapper.addMappings(new PropertyMap<PollingFaultType, PollingFaultMessage>()
    {
        @Override
        protected void configure()
        {
            map(source.getInitiatedFiles()).setInitiated(null);
            ...
        }

    });
PollingFaultType faultType = getPollingFaultType();
PollingFaultMessage faultMessage = mapper.map(faultType, PollingFaultMessage.class);

不幸的是,这会产生仅将其initiated属性映射到实际值的 faultMessage。属性errorIderrorDetail没有被映射(可能是因为它们被配置成一个完全独立的 TypeMap)

所以我的问题是 - 我如何配置 ModelMapper 以允许我定义 TypeMaps/PropertyMaps 只映射特定于子的属性,例如initiatedand并且failed具有来自基本类型的公共属性,例如自动映射?我想在这里实现的主要目标是,我想避免在每个孩子的 TypeMap 中明确指定这些公共属性的映射,即我想避免:errorIderrorDetail

mapper.addMappings(new PropertyMap<PollingFaultType, PollingFaultMessage>()
        {
            @Override
            protected void configure()
            {
                // I want to avoid to copy these lines around for each child mapping since they will be always the same
                map(source.getFaultId()).setErrorId(null);
                map(source.getFaultDescription()).setErrorDescription(null);


                map(source.getInitiatedFiles()).setInitiated(null);
                ...
            }

        });
4

1 回答 1

1

接下来尝试做:

豆子:

public class BaseType {
    protected String base;
    // getters/setters
}
public class Extended extends  BaseType {

    private String value ;
    // getters/setters
}

dto:

public class SimpleDTO {
    private String valueDTO;
    private String baseDTO;
    // getters/setters
}

配置:

modelMapper.typeMap(SimpleDTO.class, BaseType.class)
                .addMapping(SimpleDTO::getBaseDTO, BaseType::setBase);
modelMapper.typeMap(SimpleDTO.class, Extended.class)
                .addMapping(SimpleDTO::getValueDTO, Extended::setValue)
                .includeBase(SimpleDTO.class, BaseType.class);

利用:

SimpleDTO dto = new SimpleDTO();
dto.setBaseDTO("base");
dto.setValueDTO("value");
Extended ex = modelMapper.map(dto, Extended.class);

模型映射器版本:1.1.0

于 2017-12-15T10:02:41.813 回答