Java对象映射框架使用构建器模式

时间:2017-10-02 17:08:52

标签: java mapping dozer mapstruct modelmapper

是否有任何与构建器一起使用的类映射框架?我想保留一些我的类不可变并避免多个构造函数 - Builder模式来拯救。但是,我不能自动使用构建器而不是getter / setter的任何映射框架。

2 个答案:

答案 0 :(得分:1)

这可以通过MapStruct轻松完成,并为构建器使用自定义命名策略。

在文档中查看here如何使用自定义访问器命名策略。

您的映射需要看起来像:

@Mapper
public interface MyMapper {

    default Immutable map(Source source) {
        return mapToBuilder(source).build();
    }

    Immutable.Builder mapToBuilder(Source source);
}

在MapStruct中,我们已经开发了一项功能,可以支持对构建器的开箱即用支持。您可以按照this问题了解详情。

更新

MapStruct现在(自1.3.0.Beta1开始)对Immutables提供了开箱即用的支持。这意味着之前的映射器可以写成:

@Mapper
public interface MyMapper {

    Immutable map(Source source);
}

假设是Immutable中没有参数的公共静态方法返回构建器

答案 1 :(得分:1)

我使用LombokModelMapper进行了以下操作。请参阅:http://modelmapper.org/getting-started/

public class MyService {
     private ModelMapper modelMapper;

     public MyService(){
         this.modelMapper = new ModelMapper();
         this.modelMapper.getConfiguration()
            .setMatchingStrategy(MatchingStrategies.STRICT)
            .setDestinationNamingConvention(LombokBuilderNamingConvention.INSTANCE)
            .setDestinationNameTransformer(LombokBuilderNameTransformer.INSTANCE);
     }

     public OutputDTO aMethod(final InputDTO input){
          return modelMapper.map(input, OutputDTO.OutputDTOBuilder.class).build(); 
     }
}

LombokBuilderNamingConvention的位置:

import org.modelmapper.spi.NamingConvention;
import org.modelmapper.spi.PropertyType;

public class LombokBuilderNamingConvention implements NamingConvention {

    public static LombokBuilderNamingConvention INSTANCE = new LombokBuilderNamingConvention();

    @Override
    public boolean applies(String propertyName, PropertyType propertyType) {
        return PropertyType.METHOD.equals(propertyType);
    }

    @Override
    public String toString() {
        return "Lombok @Builder Naming Convention";
    }

}

LombokBuilderNameTransformer是:

import org.modelmapper.spi.NameTransformer;
import org.modelmapper.spi.NameableType;


public class LombokBuilderNameTransformer implements NameTransformer {

    public static final NameTransformer INSTANCE = new LombokBuilderNameTransformer();

    @Override
    public String transform(final String name, final NameableType nameableType) {
        return Strings.decapitalize(name);
    }

    @Override
    public String toString() {
        return "Lombok @Builder Mutator";
    }
}

OutputDTO看起来像:

@Builder // Has .builder() static method
@Value // Thus immutable
public class OutputDTO {
   private String foo;
   private int bar;
}