有没有与构建器一起使用的类映射框架?我想保持我的一些类不可变并避免使用多个构造函数 - 构建器模式可以解决这个问题。但是,我无法使用任何自动使用构建器而不是 getters/setters 的映射框架。
最佳答案
我使用Lombok
和ModelMapper
得到了以下结果。请参阅: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;
}
关于使用构建器模式的 Java 对象映射框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46530323/