MapStruct如何将DocumentId.id映射为单个String返回值?
MapStruct反向映射DocumentId到String失败的解决办法
我定义了DocumentMapper接口,toDomainModel方法可以把String类型的uuid正确转成DocumentId对象,但反向的toPersistenceModel方法生成的代码没正确提取DocumentId的id字段转成String,反而返回空字符串。相关代码如下:
原Mapper接口
@Mapper public interface DocumentMapper { @Mapping(source = "uuid", target = "id") net.gencat.transversal.espaidoc.domain.model.document.DocumentId toDomainModel(String uuid); @InheritInverseConfiguration String toPersistenceModel(net.gencat.transversal.espaidoc.domain.model.document.DocumentId id); }
DocumentId类
package net.gencat.transversal.espaidoc.domain.model.document; import java.util.UUID; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NonNull; import lombok.ToString; @Getter @AllArgsConstructor @EqualsAndHashCode @ToString @Builder public class DocumentId { private final UUID id; }
生成的错误代码
@Override public String toPersistenceModel(DocumentId id) { if ( id == null ) { return null; } String string = new String(); return string; }
问题原因
@InheritInverseConfiguration主要针对复杂对象间的双向映射继承,而这里是**简单类型(String)与值对象(DocumentId)**的转换,MapStruct无法自动识别反向逻辑需要提取DocumentId的id字段并转换为String,因此生成了无效的空字符串代码。
解决办法
直接移除@InheritInverseConfiguration,显式指定反向映射规则,或依赖MapStruct内置的UUID↔String转换器即可:
方式一:显式指定映射规则
@Mapper public interface DocumentMapper { @Mapping(source = "uuid", target = "id") DocumentId toDomainModel(String uuid); // 明确指定从DocumentId的id字段映射到返回的String @Mapping(source = "id", target = ".") String toPersistenceModel(DocumentId id); }
方式二:省略注解自动映射
因为目标是简单类型,MapStruct会自动识别并提取DocumentId的id字段完成转换:
@Mapper public interface DocumentMapper { @Mapping(source = "uuid", target = "id") DocumentId toDomainModel(String uuid); // 无需额外注解,MapStruct自动处理UUID转String String toPersistenceModel(DocumentId id); }
生成的正确代码
修改后,MapStruct会生成符合预期的转换逻辑,自动将DocumentId的UUID类型id转为String:
@Override public String toPersistenceModel(DocumentId id) { if ( id == null ) { return null; } String string = id.getId().toString(); return string; }
内容的提问来源于stack exchange,提问作者Jordi
相关产品推荐
相关产品推荐

