我有一个抽象类:
public abstract class AbstractBeanDTO<T> extends AbstractBigDTO {
protected T value;
//getter setter
}
扩展类具有泛型类型列表
public class ItemsBeanDTO extends AbstractBeanDTO<List<String>> {
}
我试图将模型类Map到同样具有相同结构的dto。
AbstractBeanDTO<?> dto = (AbstractBeanDTO<?>) modelMapper.map(modelBean, ItemsBeanDTO.class);
我的modelmapper配置为匹配strict。它能够转换其他泛型类型,如long、integer、string,但不能转换list。
我得到以下错误:
org.modelmapper.MappingException: ModelMapper mapping errors:
1) Failed to instantiate instance of destination java.util.List. Ensure that java.util.List has a non-private no-argument constructor.
Caused by: java.lang.NoSuchMethodException: java.util.List.<init>()
at java.lang.Class.getConstructor0(Unknown Source)
at java.lang.Class.getDeclaredConstructor(Unknown Source)
at org.modelmapper.internal.MappingEngineImpl.instantiate(MappingEngineImpl.java:333)
at org.modelmapper.internal.MappingEngineImpl.createDestination(MappingEngineImpl.java:348)
at org.modelmapper.internal.MappingEngineImpl.typeMap(MappingEngineImpl.java:141)
at org.modelmapper.internal.MappingEngineImpl.map(MappingEngineImpl.java:115)
at org.modelmapper.internal.converter.MergingCollectionConverter.convert(MergingCollectionConverter.java:59)
at org.modelmapper.internal.converter.MergingCollectionConverter.convert(MergingCollectionConverter.java:31)
at org.modelmapper.internal.MappingEngineImpl.convert(MappingEngineImpl.java:303)
at org.modelmapper.internal.MappingEngineImpl.map(MappingEngineImpl.java:110)
at org.modelmapper.internal.MappingEngineImpl.setDestinationValue(MappingEngineImpl.java:242)
at org.modelmapper.internal.MappingEngineImpl.propertyMap(MappingEngineImpl.java:188)
at org.modelmapper.internal.MappingEngineImpl.typeMap(MappingEngineImpl.java:152)
at org.modelmapper.internal.MappingEngineImpl.map(MappingEngineImpl.java:115)
at org.modelmapper.internal.MappingEngineImpl.map(MappingEngineImpl.java:72)
at org.modelmapper.ModelMapper.mapInternal(ModelMapper.java:573)
at org.modelmapper.ModelMapper.map(ModelMapper.java:406)
我试图用typemap显式地Map它,但它是一样的。
modelMapper.createTypeMap(ItemsBean.class, ItemsBeanDTO.class).addMappings(mapper -> {
mapper.map(src -> src.getValue(), (dest, value) -> dest.setValue((List<String>) value));
});
唯一有效的方法是将变量显式声明为list(但我不想做)
我使用的是modelmapper和java8的2.3.5版本。有人能帮我怎么做吗?
我试着使用typemap和typetoken,如下所示,
Type listType = new TypeToken<ItemsBeanDTO>() {
}.getType();
modelMapper.createTypeMap(ItemsBean.class, ItemsBeanDTO.class).addMappings(mapper -> {
mapper.map(src -> src.getValue(), (dest, value) -> dest.setValue(modelMapper.map(value, listType)));
});
在这种情况下,我得到以下错误:
java.lang.IllegalArgumentException: source cannot be null
at org.modelmapper.internal.util.Assert.notNull(Assert.java:53)
at org.modelmapper.ModelMapper.map(ModelMapper.java:493)
at com.lowteq.model.preop.controller.config.BeanModelMapperFactory.lambda$22(BeanModelMapperFactory.java:117)
at org.modelmapper.internal.ReferenceMapExpressionImpl.map(ReferenceMapExpressionImpl.java:68)
at org.modelmapper.internal.ConfigurableConditionExpressionImpl.map(ConfigurableConditionExpressionImpl.java:65)
at com.lowteq.model.preop.controller.config.BeanModelMapperFactory.lambda$20(BeanModelMapperFactory.java:117)
at org.modelmapper.internal.TypeMapImpl.addMappings(TypeMapImpl.java:266)
3条答案
按热度按时间qc6wkl3g1#
列表是一个接口,没有构造函数。
ModelMapper
需要一个具体的类,因此您需要选择List
包括ArrayList
或者LinkedList
等。pwuypxnk2#
最后我找到了解决这个问题的办法。您可以使用typemap跳过setter方法设置列表,并使用setprovider手动设置列表。
ikfrs5lh3#
你可以用我的图书馆beanknife代替。它是一个注解处理器。这意味着它会动态生成dto类。您可以检查生成的类的源代码,没有更多的魔力。转换器方法嵌入到生成的类中。它们并不复杂,但很麻烦,所以自动化是必要的。您可以筛选从原始类继承的属性,甚至可以更改或向生成的类添加新属性。库提供了一种仅通过注解转换属性的方法。例如,如果整数为空,则将其转换为零。您还可以编写自己的实现。
例如:
将生成
这里有更多的例子