You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 01:42:05