【问题标题】:Mapstruct LocalDateTime to InstantMapstruct LocalDateTime 到 Instant
【发布时间】:2018-06-02 17:26:56
【问题描述】:

我是 Mapstruct 的新手。我有一个模型对象,其中包括 LocalDateTime 类型字段。 DTO 包括Instant 类型字段。我想将LocalDateTime 类型字段映射到Instant 类型字段。我有传入请求的 TimeZone 实例。

像这样手动设置字段;

set( LocalDateTime.ofInstant(x.getStartDate(), timeZone.toZoneId()) )

如何使用 Mapstruct 映射这些字段?

【问题讨论】:

    标签: java-time mapstruct datetime-conversion localdate java.time.instant


    【解决方案1】:

    您有 2 个选项来实现您的目标。

    第一个选项:

    将 1.2.0.Final 中的新 @Context 注释用于 timeZone 属性,并定义您自己的方法来执行映射。比如:

    public interface MyMapper {
    
        @Mapping(target = "start", source = "startDate")
        Target map(Source source, @Context TimeZone timeZone);
    
        default LocalDateTime fromInstant(Instant instant, @Context TimeZone timeZone) {
            return instant == null ? null : LocalDateTime.ofInstant(instant, timeZone.toZoneId());
        }
    }
    

    MapStruct 然后将使用提供的方法在InstantLocalDateTime 之间执行映射。

    第二个选项:

    public interface MyMapper {
    
        @Mapping(target = "start", expression = "java(LocalDateTime.ofInstant(source.getStartDate(), timezone.toZoneId()))")
        Target map(Source source, TimeZone timeZone);
    }
    

    我个人的选择是使用第一个

    【讨论】:

    • 谢谢 Filip,我创建了一个包含第一选项方法(fromInstant 和 toInstant)的类。我将这个类引用到我的映射器(@Mapper(uses=LocalTimeMapper.class))。再次感谢。
    • 这样更好,因为它可以提供更好的可用性。对于其他读者,所有默认方法都可以在另一个类中完成,并通过Mapper#uses 引用
    • 我绝对同意。我有一个关于使用 Mapstruct 映射器作为 spring bean 的问题。当我使用componentModel ='spring“时,mapper将是一个单例类。(生成的类用@Component注释)。多线程请求是否存在性能问题?将mapper作为单例bean注入或每次都初始化mapper实例( Mappers.getMapper(XMapper.class);),你的偏好是什么?
    • 最好在我们的聊天中直接提出此类问题。在任何情况下,将其用作 spring bean 都不会影响性能,实际上不建议在每个请求上使用映射器工厂。如果您不想使用依赖注入,我们的建议是将映射器分配给某个静态最终字段,然后您将在任何地方使用该字段。但是,我个人使用 spring 并在需要的地方注入映射器,这也更容易用于测试目的
    • 好的,我把我的用法改成了 bean injection,感谢 Filip 的帮助。
    猜你喜欢
    • 1970-01-01
    • 2019-12-07
    • 2021-06-02
    • 2014-05-12
    • 2017-11-18
    • 2019-09-24
    • 1970-01-01
    • 2022-09-26
    • 1970-01-01
    相关资源
    最近更新 更多