ModelMapper:在运行时映射抽象 类
ModelMapper: mapping abstract classes during runtime
我正在使用 ModelMapper Framework (http://modelmapper.org/) 来映射 Java 中的对象。
我在映射包含抽象 类.
的具体 类(DTO 到 Entites)时遇到问题
示例:
Task 有一个 AbstractItems 列表。
AbstractItems 是问题和标准。
public class TaskDTO {
...
private List<AbstractItemDTO> items;
}
映射方法:
// task is an TaskDTO object
return getModelMapper().map(task, TaskEntity.class);
ModelMapper 尝试创建 AbstractItem 的新实例,这会引发异常。
有没有办法在运行时映射抽象 类 ?
喜欢 QuestionDTO -> 问题,CriteriaDTO ->Criteria
我无法用 ModelMapper 解决这个问题。因此,我切换到 Dozer。
Dozer 是 Java 中对象映射的一个很好的工具。而且它也非常易于使用。
您可以在 XML 文件中定义相应的映射 类。
这是文档的 link。 http://dozer.sourceforge.net/documentation/mappings.html
我的解决方案 Spring
推土机-bean.xml
<bean class="org.dozer.spring.DozerBeanMapperFactoryBean" lazy-init="false">
<property name="mappingFiles">
<list>
<value>META-INF/mapping/dozer-config.xml</value>
</list>
</property>
</bean>
推土机-config.xml
<mapping>
<class-a>com.packagename.dto.QuestionDTO</class-a>
<class-b>com.packagename.entities.core.Question</class-b>
</mapping>
<mapping>
<class-a>com.packagename.dto.CriteriaDTO</class-a>
<class-b>com.packagename.entities.core.Criteria</class-b>
</mapping>
我也遇到了这个问题并解决了这个问题:
public void configure(ModelMapper modelMapper) {
modelMapper.typeMap(QuestionDto.class, AbstractItem.class)
.setConverter(converterWithDestinationSupplier(Question::new));
modelMapper.typeMap(CriteriaDto.class, AbstractItem.class)
.setConverter(converterWithDestinationSupplier(Criteria::new));
}
private <S, D> Converter<S, D> converterWithDestinationSupplier(Supplier<? extends D> supplier ) {
return ctx -> ctx.getMappingEngine().map(ctx.create(ctx.getSource(), supplier.get()));
}
Converter 使用 supplier 创建所需的实例,然后使用正确的 typeMap(QuestionDto -> Question 或 CriteriaDto -> Criteria)映射所有属性。
其中使用 ModelMapper 的 kotlin 解决方案
DTO(又名来源 class)
abstract class BaseRequirementDTO()
class AttributeRequirementDTO(
var attribute: Attribute = Attribute.STRENGTH,
var attributeValue: Long = 10
) : BaseRequirementDTO()
class LevelRequirementDTO(
var requiredLevel: Long = 1
) : BaseRequirementDTO()
我的模型(又名目的地 class)
abstract class BaseRequirement() : Model()
class AttributeRequirement(
var attribute: Attribute = Attribute.STRENGTH,
var attributeValue: Long = 10
) : BaseRequirement()
class LevelRequirement(
var requiredLevel: Long = 1
) : BaseRequirement()
映射器配置
val mapper = ModelMapper()
mapper.configuration.matchingStrategy = MatchingStrategies.STRICT
mapper.createTypeMap(BaseRequirement::class.java, BaseRequirementDTO::class.java)
mapper.typeMap(AttributeRequirementDTO::class.java, BaseRequirement::class.java)
.setProvider { request -> mapper.map(request.source, AttributeRequirement::class.java) }
mapper.typeMap(LevelRequirementDTO::class.java, BaseRequirement::class.java)
.setProvider { request -> mapper.map(request.source, LevelRequirement::class.java) }
ModelMapper 版本:2.3.7
https://github.com/modelmapper/modelmapper/issues/182#issuecomment-660965119
我正在使用 ModelMapper Framework (http://modelmapper.org/) 来映射 Java 中的对象。 我在映射包含抽象 类.
的具体 类(DTO 到 Entites)时遇到问题示例:
Task 有一个 AbstractItems 列表。
AbstractItems 是问题和标准。
public class TaskDTO {
...
private List<AbstractItemDTO> items;
}
映射方法:
// task is an TaskDTO object
return getModelMapper().map(task, TaskEntity.class);
ModelMapper 尝试创建 AbstractItem 的新实例,这会引发异常。
有没有办法在运行时映射抽象 类 ?
喜欢 QuestionDTO -> 问题,CriteriaDTO ->Criteria
我无法用 ModelMapper 解决这个问题。因此,我切换到 Dozer。
Dozer 是 Java 中对象映射的一个很好的工具。而且它也非常易于使用。
您可以在 XML 文件中定义相应的映射 类。
这是文档的 link。 http://dozer.sourceforge.net/documentation/mappings.html
我的解决方案 Spring
推土机-bean.xml
<bean class="org.dozer.spring.DozerBeanMapperFactoryBean" lazy-init="false">
<property name="mappingFiles">
<list>
<value>META-INF/mapping/dozer-config.xml</value>
</list>
</property>
</bean>
推土机-config.xml
<mapping>
<class-a>com.packagename.dto.QuestionDTO</class-a>
<class-b>com.packagename.entities.core.Question</class-b>
</mapping>
<mapping>
<class-a>com.packagename.dto.CriteriaDTO</class-a>
<class-b>com.packagename.entities.core.Criteria</class-b>
</mapping>
我也遇到了这个问题并解决了这个问题:
public void configure(ModelMapper modelMapper) {
modelMapper.typeMap(QuestionDto.class, AbstractItem.class)
.setConverter(converterWithDestinationSupplier(Question::new));
modelMapper.typeMap(CriteriaDto.class, AbstractItem.class)
.setConverter(converterWithDestinationSupplier(Criteria::new));
}
private <S, D> Converter<S, D> converterWithDestinationSupplier(Supplier<? extends D> supplier ) {
return ctx -> ctx.getMappingEngine().map(ctx.create(ctx.getSource(), supplier.get()));
}
Converter 使用 supplier 创建所需的实例,然后使用正确的 typeMap(QuestionDto -> Question 或 CriteriaDto -> Criteria)映射所有属性。
其中使用 ModelMapper 的 kotlin 解决方案
DTO(又名来源 class)
abstract class BaseRequirementDTO()
class AttributeRequirementDTO(
var attribute: Attribute = Attribute.STRENGTH,
var attributeValue: Long = 10
) : BaseRequirementDTO()
class LevelRequirementDTO(
var requiredLevel: Long = 1
) : BaseRequirementDTO()
我的模型(又名目的地 class)
abstract class BaseRequirement() : Model()
class AttributeRequirement(
var attribute: Attribute = Attribute.STRENGTH,
var attributeValue: Long = 10
) : BaseRequirement()
class LevelRequirement(
var requiredLevel: Long = 1
) : BaseRequirement()
映射器配置
val mapper = ModelMapper()
mapper.configuration.matchingStrategy = MatchingStrategies.STRICT
mapper.createTypeMap(BaseRequirement::class.java, BaseRequirementDTO::class.java)
mapper.typeMap(AttributeRequirementDTO::class.java, BaseRequirement::class.java)
.setProvider { request -> mapper.map(request.source, AttributeRequirement::class.java) }
mapper.typeMap(LevelRequirementDTO::class.java, BaseRequirement::class.java)
.setProvider { request -> mapper.map(request.source, LevelRequirement::class.java) }
ModelMapper 版本:2.3.7
https://github.com/modelmapper/modelmapper/issues/182#issuecomment-660965119