【问题标题】:How to rewrite Modelmapper Converter as Lambda Expression (java 1.8)?如何将 Modelmapper 转换器重写为 Lambda 表达式(java 1.8)?
【发布时间】:2018-08-23 09:11:39
【问题描述】:

我用的是ModelMapper 2.1.0,有一个接口叫Converter

我正在像这样使用这个转换器(模型映射器):

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 表达式,并真正转换?

【问题讨论】:

  • 你能发布你的单元测试吗?如果它根本不应该编译的话,真的不可能返回 null。
  • 要实现这一点,您需要为此 lambda 表达式提供功能接口,但您使用的转换器不是功能接口
  • 我把课程改成测试

标签: java spring lambda java-8 modelmapper


【解决方案1】:

我认为这个问题是 ModelMapper 无法正确解析来自 lambda 表达式的泛型类型。

这里是解决方法:

modelMapper.typeMap(Source.class, Destination.class)
  .setConverter(ctx -> new Destination(ctx.getSource));

【讨论】:

    【解决方案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());
    

    【讨论】:

    • 默认情况下,org.springframework.core.convert.Converter是一个函数式接口吧?
    • 我虽然是 OP 的自定义类。是的,org.springframework.core.convert.Converter 是一个功能接口。然后 lambda 应该可以工作了。
    • 我认为问题在于我们不能很好地解决转换器的泛型类型。
    • 也许你可以试试 modelMapper.typeMap(Source.class, Destination.class).setConverter(ctx -> new Destination(ctx.getSource));或 modelMapper.addConverter(Source.class, Destination.class, ctx -> new Destination(ctx.getSource));
    • @AshokKumarN 我正在使用 org.modelmapper.Converter 本身的转换器。它不是定制的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多