我有以下类层次结构:
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。属性errorId
等errorDetail
没有被映射(可能是因为它们被配置成一个完全独立的 TypeMap)
所以我的问题是 - 我如何配置 ModelMapper 以允许我定义 TypeMaps/PropertyMaps 只映射特定于子的属性,例如initiated
and并且failed
具有来自基本类型的公共属性,例如自动映射?我想在这里实现的主要目标是,我想避免在每个孩子的 TypeMap 中明确指定这些公共属性的映射,即我想避免:errorId
errorDetail
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);
...
}
});