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

MapStruct映射时如何设置当前时间(now())值?

MapStruct 设置 DateTime/Instant 为当前时间的实现方法

你的写法存在问题:defaultValue 参数要求传入字符串字面量,无法直接调用 Instant.now() 这类方法,所以编译会报错。下面提供几种可行的实现方式:

1. 无条件设置为当前时间(覆盖源字段值)

使用 @Mapping 的 expression 属性,直接调用静态方法生成当前时间:

@Mapper(componentModel = "spring", imports = {Instant.class})
public interface DemoMapper {

    @Mapping(source = "created", target = "created", expression = "java(Instant.now())")
    Employee toEntity(EmployeeDto source);

    EmployeeDto toDto(Employee destination);
}

这种方式会忽略 DTO 中 created 字段的值,始终将 Entity 的 created 设置为当前时间。

2. 仅当源字段为 null 时设置当前时间

如果需要保留 DTO 中已有的 created 值,仅在其为 null 时填充当前时间,使用 defaultExpression:

@Mapper(componentModel = "spring", imports = {Instant.class})
public interface DemoMapper {

    @Mapping(source = "created", target = "created", defaultExpression = "java(Instant.now())")
    Employee toEntity(EmployeeDto source);

    EmployeeDto toDto(Employee destination);
}

3. 复杂逻辑场景(使用 @AfterMapping)

如果需要更灵活的逻辑判断(比如根据其他字段决定是否设置时间),可以结合 @AfterMapping 和默认方法:

@Mapper(componentModel = "spring")
public interface DemoMapper {

    Employee toEntity(EmployeeDto source);

    EmployeeDto toDto(Employee destination);

    @AfterMapping
    default void setCreatedTime(@MappingTarget Employee employee, EmployeeDto source) {
        // 按需调整逻辑:比如仅当Entity的created未被赋值时设置当前时间
        if (employee.getCreated() == null) {
            employee.setCreated(Instant.now());
        }
        // 也可以无条件设置:employee.setCreated(Instant.now());
    }
}

内容的提问来源于stack exchange,提问作者Jack

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 05:22:11