gpt4 book ai didi

java - 如何将父类DTO映射到父类实体

转载 作者:行者123 更新时间:2023-12-02 11:51:53 25 4
gpt4 key购买 nike

我有以下类层次结构:

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);

不幸的是,这会产生仅将其initied属性映射到实际值的faultMessage。属性 errorIderrorDetail 等未映射(可能是因为它们被配置到完全独立的 TypeMap 中)

所以我的问题是 - 如何配置 ModelMapper 以允许我定义仅映射特定于子属性的 TypeMaps/PropertyMaps,例如 initatedfailed并自动映射来自基本类型的common属性,例如errorIderrorDetail?我在这里想要实现的主要目标是避免必须在每个子项的 TypeMap 中显式指定这些常见属性的映射,即我想避免:

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);
...
}

});

最佳答案

尝试下一步:

bean 类:

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);

ModelMapper版本:1.1.0

关于java - 如何将父类DTO映射到父类实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47829144/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com