Android Mapstruct kotlin和@Named注释

Android Mapstruct kotlin和@Named注释,android,kotlin,mapstruct,Android,Kotlin,Mapstruct,我正在将一些宠物项目从java转换为kotlin,遇到了一些无法解决的问题。在java中,所有编译都很好,但转换为Kotlin后不希望 。。。 导入org.mapstruct.Mapper 导入org.mapstruct.Mapping 导入org.mapstruct.Named ... @映射程序(UnappedTargetPolicy=ReportingPolicy.ERROR) 界面效应映射器{ @映射(source=“icon”、target=“icon”、qualifiedByName

我正在将一些宠物项目从java转换为kotlin,遇到了一些无法解决的问题。在java中,所有编译都很好,但转换为Kotlin后不希望

。。。
导入org.mapstruct.Mapper
导入org.mapstruct.Mapping
导入org.mapstruct.Named
...
@映射程序(UnappedTargetPolicy=ReportingPolicy.ERROR)
界面效应映射器{
@映射(source=“icon”、target=“icon”、qualifiedByName=[“convertIcon”])
趣味TOD(effectDTO:effectDTO):EffectDS
趣味Todsar(effectDTOArrayList:ArrayList):ArrayList
@命名(“convertIcon”)
有趣的convertIcon(对象:字符串?):ByteArray{
如果(obj!=null)返回{
Base64.decode(obj,Base64.DEFAULT)
}否则{
无效的
}
}
伴星{
val MAPPER=Mappers.getMapper(EffectMapper::class.java)
}
}
梯度返回误差

 error: Can't generate mapping method from non-iterable type to iterable type.
    public abstract byte[] convertIcon(@org.jetbrains.annotations.Nullable()

最后是这样做的

@Mapper(unmappedTargetPolicy=ReportingPolicy.ERROR,uses=[EffectMapperImpl::class])
界面效应映射器{
趣味TOD(effectDTO:effectDTO):EffectDS
趣味Todsar(effectDTOArrayList:ArrayList):ArrayList
伴星{
val映射器:EffectMapper=Mappers.getMapper(EffectMapper::class.java)
}
}
对象效应MapPerImpl{
有趣的convertIcon(对象:字符串?):ByteArray{
如果(obj!=null)返回{
Base64.decode(obj,Base64.DEFAULT)
}否则{
无效的
}
}
趣味效果(s:字符串):效果{
回报效应
}
}

谢谢@Filip

您看到的问题是由于
convertIcon
方法在
EffectMapper
界面中未被识别为默认方法


即使您使用
@JvmDefault
,由于以下原因,它也无法工作。我建议您将
convertIcon
方法提取到另一个类中的公共静态方法中,然后通过
Mapper\35; uses

使用它。我使用的是Kotlin 1.3.71-release-431,它可以与@JvamDefault一起工作,所以您只需要在(java)中使转换方法(toEffect)静态

映射(source=“sourceFiledName”,target=“destinationfilename”,qualifiedByName=[“converterMethod”])
界面效应映射器{
趣味TOD(effectDTO:effectDTO):EffectDS
趣味Todsar(effectDTOArrayList:ArrayList):ArrayList
伴星{
@JvmStatic
@命名(“转换方法”)
趣味效果(s:字符串):效果{
回报效应
}
}
}

公共静态类应该是Java类,也可以是Kotlin。你能提供一点代码吗。
Can't map property "java.lang.String icon" to "byte[] icon". Consider to declare/implement a mapping method: "byte[] map(java.lang.String value)".
    @org.mapstruct.Mapping(source = "icon", target = "icon", qualifiedByName = {"convertIcon"})
Can't map property "java.lang.String effect" to "one.codium.funart.DataStructure.effect.Effect effect". Consider to declare/implement a mapping method: "one.codium.funart.DataStructure.effect.Effect map(java.lang.String value)".
    public abstract one.codium.funart.DataStructure.EffectDS toDS(@org.jetbrains.annotations.NotNull()
Mapping(source = "sourceFiledName", target = "destinationFiledName", qualifiedByName = ["converterMethod"])
interface EffectMapper {
  fun toDS(effectDTO: EffectDTO): EffectDS
  
  fun toDSarr(effectDTOArrayList: ArrayList<EffectDTO>): ArrayList<EffectDS>
  
  companion object {
     @JvmStatic
     @Named("converterMethod")
     fun toEffect(s: String): Effect {
        return Effect(s)
      }
  }
}