我们使用

immutables framework生成所有DTO.现在我们想用

mapstruct将这些对象映射到另一个.但生成的DTO是不可变的,没有setter,也没有构造函数,对应于builder模式.它们仅通过静态builder() – 方法访问的相应构建器填充.

我们试图将DTO1映射到DTO2.Builder,如果mapstruct能识别Builder中的setter但这些没有void返回类型但返回Builder本身以进行流畅的连接,那么它将起作用.

所以这是示例的代码.

我们有两个接口

@Value.Immutable

public interface MammalDto {

public Integer getNumberOfLegs();

public Long getNumberOfStomachs();

}

@Value.Immutable

public interface MammalEntity {

public Long getNumberOfLegs();

public Long getNumberOfStomachs();

}

然后我们有了maptruct的Mapper接口:

@Mapper(uses = ObjectFactory.class)

public interface SourceTargetMapper {

SourceTargetMapper MAPPER = Mappers.getMapper( SourceTargetMapper.class );

ImmutableMammalEntity.Builder toTarget(MammalDto source);

}

要使mapORG找到Builder,我们需要一个Factory:

public class ObjectFactory {

public ImmutableMammalDto.Builder createMammalDto() {

return ImmutableMammalDto.builder();

}

public ImmutableMammalEntity.Builder createMammalEntity() {

return ImmutableMammalEntity.builder();

}

}

为了生成代码,编译器插件被指示使用两个注释处理器:

org.apache.maven.plugins

maven-compiler-plugin

3.6.1

1.8

1.8

org.immutables

value

2.2.8

org.mapstruct

mapstruct-processor

1.2.0.Beta3

注意:这仅适用于mapstruct版本> 1.2.x.旧版本在干净构建(mvn clean compile)中存在问题,即它们找不到不可变构建的源.在第二个构建(没有干净)中,他们会找到immutables实现,因为它们在注释处理器运行之前位于类路径中.这个bug现在已修复.

这就像一个魅力.首先生成interfactes的Immutable实现,并且mapstruct使用它们来生成构建器.

但测试表明没有设置属性:

@Test

public void test() {

MammalDto s = ImmutableMammalDto.builder().numberOfLegs(4).numberOfStomachs(3l).build();

MammalEntity t = SourceTargetMapper.MAPPER.toTarget(s).build();

assertThat(t.getNumberOfLegs()).isEqualTo(4);

assertThat(t.getNumberOfStomachs()).isEqualTo(3);

}

断言失败.一看maptruct生成的mapper就会发现它显然没有找到任何setter:

@Generated(

value = "org.mapstruct.ap.MappingProcessor",

//...

)

public class SourceTargetMapperImpl implements SourceTargetMapper {

private final ObjectFactory objectFactory = new ObjectFactory();

@Override

public Builder toTarget(MammalDto source) {

if ( source == null ) {

return null;

}

Builder builder = objectFactory.createMammalEntity();

return builder;

}

}

返回空构建器.我认为原因是生成的构建器的setter实现,因为它返回自身以创建一个流畅的API:

public final Builder numberOfLegs(Long numberOfLegs) {

this.numberOfLegs = Objects.requireNonNull(numberOfLegs, "numberOfLegs");

return this;

}

有没有办法让mapstruct找到这些setter?或者甚至是用构建器处理这些不可变对象的更好方法?

编辑:正如我在评论中所说,我遇到了Issue #782.在版本1.2.0.Beta3建设者仍然不支持.但是关于这个主题有几个讨论,所以如果一个人遇到同样的问题,可能会有兴趣.

java静态注解处理器_java – 使用mapstruct中的builder(使用immutables注释处理器)将对象映射到不可变对象...相关推荐

  1. java创建一个不可变对象_使用不可变对象创建值对象

    java创建一个不可变对象 在回答我最近的文章中AutoValue:生成的不可变的值类 , 布兰登认为,这可能是有趣的,看看如何AutoValue比较项目Lombok和Immutables和凯文借调这 ...

  2. java静态变量特点_Java中static的特点

    前两天面试时被问到静态的特点,当时回答地不是很好,现在来总结一下 在了解某样东西的时候我们通常会从它是什么,为什么,和怎么样在三方面来衡量,对于java中的static,我们也这样讨论下,要明确以下几 ...

  3. java 自定义注解 解析_java自定义注解

    1.Annotation的工作原理: JDK5.0中提供了注解的功能,允许开发者定义和使用自己的注解类型.该功能由一个定义注解类型的语法和描述一个注解声明的语法,读取注解的API,一个使用注解修饰的c ...

  4. java 反射 注解 运用_Java注解与反射的使用

    打开 Eclipse,新建 Java 项目"注解与反射",在 src 下右键并建立包 "注解与反射",在包下右键并建立 Annotation (注解)文件,名称 ...

  5. java 静态缓存示例_Java 9 JShell示例:集合静态工厂方法

    java 静态缓存示例 这篇文章继续从My My Java 9 Features博客文章中探索Java9功能. 在这里,我们在List,Set和Map接口中试验Java9 Collections静态工 ...

  6. java 静态初始化数据_Java 静态数据初始化的示例代码

    无论创建多少个对象,静态数据都只占用一份存储区域.static关键字不能应用于局部变量,因此它只能作用于域.如果一个域是静态的基本类型域,且也没有对它进行初始化,那么它就会获得基本类型的标准初始值:如 ...

  7. java 静态初始化数据_Java静态数据初始化

    夯实Java基础的工作依旧在进行中,再记录些东西吧.Java基础本来就不够扎实,再加上一些知识大二时老师甚至没有讲到,温故知新. Java程序初始化的顺序是先进行静态对象的初始化,随后是"非 ...

  8. java 静态变量声明_java静态变量怎么声明?

    展开全部 个人的总结 1 静态变量e69da5e6ba9062616964757a686964616f31333337616564只有一份被类的所有实例共享 2 静态变量的声明在编译时已经明确了内存的 ...

  9. java 静态常量定义_Java常量定义需要注意事项及static作用(复习)

    在任何开发语言中,都需要定义常量.在Java开发语言平台中也不例外.不过在Java常量定义的时候,跟其他语言有所不同.其有自己的特色.在这篇文章中,主要针对Java语言中定义常量的注意事项进行解析,帮 ...

最新文章

  1. 年度书单盘点 | 史上最卷考研潮过后,这十本书让你不再迷茫
  2. oracle 日期 extract,ORACLE——EXTRACT() 截取日期时间的函数使用
  3. Android源代码介绍,Android-Log源码详解
  4. [Bzoj4540][Hnoi2016] 序列(莫队 + ST表 + 单调队列)
  5. c语言编程统计单词的个数,使用c语言如何统计单词个数
  6. jdk的selector(2)channel的注册
  7. oracle 10g的闪回删除与回收站
  8. usaco-3.3-shopping-passed
  9. ubuntu安装vmware-tools
  10. 荣耀手机两个android文件夹,华为手机文件管理中,这几个文件夹可以任意删除,其他的千万不要乱删!...
  11. python访问字符串中的部分字符的操作_Python字符串基础操作
  12. MacOSX安装OpenCC实现繁体字转简体字
  13. 在git clone报错
  14. 通证估值模型-费雪模型与净现值模型详解
  15. UML中关系(4+4)
  16. 考研线性代数深入理解
  17. 宏观经济调控政策笔记+
  18. 研制过程评审活动(二)方案阶段
  19. “hulu客厅”开放,Spark培训计划报名啦
  20. What is null?

热门文章

  1. spring-boot+spring-session集成
  2. Nginx的端口修改问题
  3. Loadrunner脚本编程(4)-数据类型操作和字符串操作
  4. C#的变迁史 - C# 4.0 之多线程篇
  5. 和信虚拟终端的全面部署-虚拟终端网络工程实施
  6. FreeSwitch通过远程接口验证用户登录
  7. Iphone革了谁的命?
  8. 158.用 Read4 读取 N 个字符read characters from file multiple calls
  9. mfc实验报告心得体会_mfc实验报告.doc
  10. 计算机毕业设计中用python神经网络编程实现手写数字识别