Mapstruct kotlin 和 @Named 注解
Mapstruct kotlin and @Named annotation
我正在将一些宠物项目从 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)
}
}
Gradlereturn错误
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
您看到的问题是由于 convertIcon
方法未被识别为 EffectMapper
接口中的默认方法。
即使您使用 @JvmDefault
,由于 KT-25960 也无法使用。我建议您将 convertIcon
方法提取到另一个 class 中的 public 静态方法中,然后通过 Mapper#uses
使用它
我使用的是 Kotlin 1.3.71-release-431,它与@JvamDefault 一起工作正常,所以你只需要在 (java).[=11= 中将你的转换方法 (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)
}
}
}
我正在将一些宠物项目从 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)
}
}
Gradlereturn错误
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
您看到的问题是由于 convertIcon
方法未被识别为 EffectMapper
接口中的默认方法。
即使您使用 @JvmDefault
,由于 KT-25960 也无法使用。我建议您将 convertIcon
方法提取到另一个 class 中的 public 静态方法中,然后通过 Mapper#uses
我使用的是 Kotlin 1.3.71-release-431,它与@JvamDefault 一起工作正常,所以你只需要在 (java).[=11= 中将你的转换方法 (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)
}
}
}