android - Mapstruct kotlin 和 @Named 注解

标签 android kotlin mapstruct

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

...
import org.mapstruct.Mapper
import org.mapstruct.Mapping
import org.mapstruct.Named
...

@Mapper(unmappedTargetPolicy = ReportingPolicy.ERROR)
interface EffectMapper {

    @Mapping(source = "icon", target = "icon", qualifiedByName = ["convertIcon"])
    fun toDS(effectDTO: EffectDTO): EffectDS

    fun toDSarr(effectDTOArrayList: ArrayList<EffectDTO>): ArrayList<EffectDS>

    @Named("convertIcon")
    fun convertIcon(obj: String?): ByteArray? {
        return if (obj != null) {
            Base64.decode(obj, Base64.DEFAULT)
        } else {
            null
        }
    }

    companion object {
        val MAPPER = Mappers.getMapper(EffectMapper::class.java)
    }
}

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


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()

终于通过这种方式完成了

@Mapper(unmappedTargetPolicy = ReportingPolicy.ERROR, uses = [EffectMapperImpl::class])
interface EffectMapper {

    fun toDS(effectDTO: EffectDTO): EffectDS

    fun toDSarr(effectDTOArrayList: ArrayList<EffectDTO>): ArrayList<EffectDS>

    companion object {
        val MAPPER: EffectMapper = Mappers.getMapper(EffectMapper::class.java)
    }
}

object EffectMapperImpl {

    fun convertIcon(obj: String?): ByteArray? {
        return if (obj != null) {
            Base64.decode(obj, Base64.DEFAULT)
        } else {
            null
        }
    }

    fun toEffect(s: String): Effect {
        return Effect(s)
    }
}

谢谢@Filip

最佳答案

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

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)
      }
  }
}

关于android - Mapstruct kotlin 和 @Named 注解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57924875/

相关文章:

kotlin - Room + LiveData 动态变更查询功能

java - MapStruct 与 Spring Boot,使用自定义注释来注释生成的类

Android 2.2 支持 xlargescreen 布局

android - 刷新 fragment 中 listView 的 Item 的 TextSize

kotlin - 如何使用 Kotlin 协程从 Deferred future 创建 Observable

android - "x"隐藏父类(super class)型 'Enum' 的成员并需要 'override' 修饰符 - Kotlin

java - 寻找 Hook Xposed 模块的方法

android - 由于 Auth,应用程序和服务器紧密耦合

java - mapstruct 未在双向 OneToMany 上正确设置关系

java - Mapstruct 生成用于依赖注入(inject)的构造函数