我使用 ModelMapper 2.1.0 ,并且有一个名为 Converter
的接口我正在像这样使用Converter(modelmapper):
import org.modelmapper.Converter;
public class MyClass {
private ModelMaper myMapper = new ModelMapper();
Converter<Instant, java.util.Date> myDateConverter;
@Before
public void setup() {
myDateConverter = new Converter<Instant, java.util.Date>() {
@Override
public java.util.Date convert(MappingContext<Instant, java.util.Date> mappingContext) {
return java.util.Date.from(mappingContext.getSource());
}
}
}
@Test
public void fromDto() {
myMapper.addConverter(myDateConverter);
....
assertThat(domain.getDate()).isEqualTo(dto.getDate())
}
}
现在,我只想像这样用lambda重写匿名内部类:
myDateConverter = mappingContext -> java.util.Date.from(mappingContext.getSource());
但是当我测试(JUnit)时,转换器是lambda表达式时返回null
。
如何将该匿名内部类重写为实际上可以转换的lambda表达式?
答案 0 :(得分:2)
lambda本身有效并且应该起作用。限制是Converter
必须是功能接口,而不是类。
此表达式的目标类型必须是功能接口
@FunctionalInterface
public interface Converter<T1, T2> {
public Date convert(MappingContext<Instant, Date> mappingContext);
}
然后,lambda看起来一样并且应该工作:
myDateConverter = mappingContext -> java.util.Date.from(mappingContext.getSource());
答案 1 :(得分:2)
我认为这个问题是ModelMapper无法正确地通过lambda表达式解析泛型。
这是解决方法:
modelMapper.typeMap(Source.class, Destination.class)
.setConverter(ctx -> new Destination(ctx.getSource));