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
相关产品推荐
相关产品推荐

