java静态注解处理器_java – 使用mapstruct中的builder(使用immutables注释处理器)将对象映射到不可变对象...
我们使用
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注释处理器)将对象映射到不可变对象...相关推荐
- java创建一个不可变对象_使用不可变对象创建值对象
java创建一个不可变对象 在回答我最近的文章中AutoValue:生成的不可变的值类 , 布兰登认为,这可能是有趣的,看看如何AutoValue比较项目Lombok和Immutables和凯文借调这 ...
- java静态变量特点_Java中static的特点
前两天面试时被问到静态的特点,当时回答地不是很好,现在来总结一下 在了解某样东西的时候我们通常会从它是什么,为什么,和怎么样在三方面来衡量,对于java中的static,我们也这样讨论下,要明确以下几 ...
- java 自定义注解 解析_java自定义注解
1.Annotation的工作原理: JDK5.0中提供了注解的功能,允许开发者定义和使用自己的注解类型.该功能由一个定义注解类型的语法和描述一个注解声明的语法,读取注解的API,一个使用注解修饰的c ...
- java 反射 注解 运用_Java注解与反射的使用
打开 Eclipse,新建 Java 项目"注解与反射",在 src 下右键并建立包 "注解与反射",在包下右键并建立 Annotation (注解)文件,名称 ...
- java 静态缓存示例_Java 9 JShell示例:集合静态工厂方法
java 静态缓存示例 这篇文章继续从My My Java 9 Features博客文章中探索Java9功能. 在这里,我们在List,Set和Map接口中试验Java9 Collections静态工 ...
- java 静态初始化数据_Java 静态数据初始化的示例代码
无论创建多少个对象,静态数据都只占用一份存储区域.static关键字不能应用于局部变量,因此它只能作用于域.如果一个域是静态的基本类型域,且也没有对它进行初始化,那么它就会获得基本类型的标准初始值:如 ...
- java 静态初始化数据_Java静态数据初始化
夯实Java基础的工作依旧在进行中,再记录些东西吧.Java基础本来就不够扎实,再加上一些知识大二时老师甚至没有讲到,温故知新. Java程序初始化的顺序是先进行静态对象的初始化,随后是"非 ...
- java 静态变量声明_java静态变量怎么声明?
展开全部 个人的总结 1 静态变量e69da5e6ba9062616964757a686964616f31333337616564只有一份被类的所有实例共享 2 静态变量的声明在编译时已经明确了内存的 ...
- java 静态常量定义_Java常量定义需要注意事项及static作用(复习)
在任何开发语言中,都需要定义常量.在Java开发语言平台中也不例外.不过在Java常量定义的时候,跟其他语言有所不同.其有自己的特色.在这篇文章中,主要针对Java语言中定义常量的注意事项进行解析,帮 ...
最新文章
- 年度书单盘点 | 史上最卷考研潮过后,这十本书让你不再迷茫
- oracle 日期 extract,ORACLE——EXTRACT() 截取日期时间的函数使用
- Android源代码介绍,Android-Log源码详解
- [Bzoj4540][Hnoi2016] 序列(莫队 + ST表 + 单调队列)
- c语言编程统计单词的个数,使用c语言如何统计单词个数
- jdk的selector(2)channel的注册
- oracle 10g的闪回删除与回收站
- usaco-3.3-shopping-passed
- ubuntu安装vmware-tools
- 荣耀手机两个android文件夹,华为手机文件管理中,这几个文件夹可以任意删除,其他的千万不要乱删!...
- python访问字符串中的部分字符的操作_Python字符串基础操作
- MacOSX安装OpenCC实现繁体字转简体字
- 在git clone报错
- 通证估值模型-费雪模型与净现值模型详解
- UML中关系(4+4)
- 考研线性代数深入理解
- 宏观经济调控政策笔记+
- 研制过程评审活动(二)方案阶段
- “hulu客厅”开放,Spark培训计划报名啦
- What is null?
热门文章
- spring-boot+spring-session集成
- Nginx的端口修改问题
- Loadrunner脚本编程(4)-数据类型操作和字符串操作
- C#的变迁史 - C# 4.0 之多线程篇
- 和信虚拟终端的全面部署-虚拟终端网络工程实施
- FreeSwitch通过远程接口验证用户登录
- Iphone革了谁的命?
- 158.用 Read4 读取 N 个字符read characters from file multiple calls
- mfc实验报告心得体会_mfc实验报告.doc
- 计算机毕业设计中用python神经网络编程实现手写数字识别