Java 扩展现有Mapstruct接口以添加其他映射方法

Java 扩展现有Mapstruct接口以添加其他映射方法,java,inheritance,mapstruct,Java,Inheritance,Mapstruct,我有一个Mapstruct映射器,它已经在我的应用程序当前使用的公共库中定义。我有一个新的映射器方法,我想添加到这个映射器中,它是特定于我的应用程序的,所以我不想修改原始映射器来添加这个功能 我曾尝试扩展接口,但一直遇到问题。目前,对于下面的代码,它将进行编译,但会抛出运行时异常,因为Mapstruct没有生成MyMapperExtendedImpl类 原因:java.lang.RuntimeException:java.lang.ClassNotFoundException:找不到com.wh

我有一个Mapstruct映射器,它已经在我的应用程序当前使用的公共库中定义。我有一个新的映射器方法,我想添加到这个映射器中,它是特定于我的应用程序的,所以我不想修改原始映射器来添加这个功能

我曾尝试扩展接口,但一直遇到问题。目前,对于下面的代码,它将进行编译,但会抛出运行时异常,因为Mapstruct没有生成MyMapperExtendedImpl类

原因:java.lang.RuntimeException:java.lang.ClassNotFoundException:找不到com.whather.package.name.MyMapperExtended的实现

我确实收到Sonar的警告,当我试图通过调用Mappers.getMapper(MyMapperExtended.class)访问映射器时,它没有@mapper注释。然后,我通过删除@MapperConfig注释并将其替换为父映射器中相同的@Mapper(imports={SomeUtilityClass.class})来更改MyMapperExtended.class。代码不再编译,我有一系列错误,说找不到某些变量。这些变量似乎是函数参数,因为名称完全匹配

如何正确扩展现有的MyMapper接口,以便向其添加其他映射方法

@MapperConfig(uses=MyMapper.class)
公共接口MyMapperExtended扩展MyMapper{
默认列表someObjectListToChildClassList(列表someList){
//这里的一些特殊逻辑和循环使得它不能使用@Mapping注释
//调用父对象的映射器,以便映射基本属性
ParentClass mappedParentClass=this.someObjectListToParentClassList(someList);
//使用复制构造函数复制映射的基本属性
ChildClass myChildClass=新的ChildClass(mappedParentClass);
myChildClass.setExtraProperty(“任意值”);
返回myChildClass;
}
}
来自共享公共库的映射器

@Mapper(导入={someutilityplass.class})
公共接口MyMapper{
@映射(target=“id”,source=“someId”)
@映射(target=“name”,source=“name”)
@映射(target=“someFieldWeIgnoreWhileMapping”,ignore=true)
父类someObjectListToParentClass(SomeObject SomeObject)
列出someObjectListToParentClassList(列出someList)
}
类ParentClass和ChildClass也被映射(简化为不显示成员变量的getter/setter)

公共类父类{
UUID-id;
字符串名;
字符串somefieldweignorehillemapping;
公共父类(){}
}
公营儿童班{
字符串外部属性;
公共子类(父类父类){
超级();
this.setId(parent.getId());
this.setName(parent.getName());
}
}
正在用作映射的源对象的SomeObject类

公共类SomeObject{
UUID-someId;
字符串名;
字符串someFieldWeIgnore;
公共对象(){}
}

在处理了几个不同的问题之后。我最终让它在生成代码的地方“工作”,但它对我的用例不起作用。我在上面发布的代码中排除了“expression”的使用,因为我当时认为它不相关,但它导致了最终的问题

映射(target=“id”,source=“someId”) @映射(target=“name”,source=“name”) @映射(target=“someFieldWeIgnoreWhileMapping”,ignore=true) @映射(expression=“java(someutilityplass.doSomethingHelpful(someObject.getSpecialField())”,target=“specialField”) 父类someObjectListToParentClass(SomeObject SomeObject); 从Mapstruct生成的代码如下所示

公共父类someObjectListToParentClass(SomeObject arg0){
如果(arg0==null){
返回null;
}否则{
ParentClass ParentClass=新的ParentClass();
setId(arg0.getId());
parentClass.setName(arg0.getName());
//这个问题。
//它将变量名设置为“someObject”,因为这是表达式在接口中硬编码的内容,但变量实际上是arg0
parentClass.setSpecialField(SomeUtilityClass.dosomeThingHelp(someObject.getSpecialField());
}
}
对于没有像我这样的场景的人来说,添加@Mapper应该可以(包括所有导入,如果有的话)。我决定只制作一个单独的映射器,而不是从原始映射器继承