繁体   English   中英

使用Orika切换开/关null的映射?

[英]Toggle mapping of nulls on/off using Orika?

我正在使用Orika,有时需要映射空值(源Bean上的空值应使用空值覆盖目标Bean上的值),而在其他情况下则需要忽略空值(源Bean上的空值不会覆盖目标Bean上的现有值) 。

Orika可以使用mapNulls(true / false)方法来支持此功能。 因此,我想到了创建两个单独的mapper工厂,对一个工厂进行mapNulls(false),对另一个工厂进行mapNulls(true)的处理。 然后,我将在两个工厂上重复所有相同的类映射配置。 然后,根据我是否要映射空值,可以在运行时选择合适的工厂。

但是,文档显示创建这些工厂和外墙非常昂贵,因此这样做似乎很浪费,并且需要我拥有2个工厂和2个外墙映射器,所有相同的类映射重复两次。

有谁知道使用Orika更好的方法吗? 我将不胜感激任何建议! 谢谢-加里。

尝试不将空字段设置为JPA实体时,我有类似的要求。 但是反向应该设置来自数据库的空值。 我不知道您是否需要“有时”状态。 但是,如果您需要识别(在我的情况下为@Entity),则可以在bean上映射mapNulls。

我已经编写了ma.glasnost.orika.impl.ConfigurableMapper并重写了其中的map方法之一。

@Override
    public <S, D> void map(S sourceObject, D destinationObject) {
        if (!factory.existsRegisteredMapper(TypeFactory.valueOf(sourceObject.getClass()), TypeFactory.valueOf(destinationObject.getClass()), false)){
            ClassMapBuilder mapBuilder = factory.classMap(sourceObject.getClass(), destinationObject.getClass());
            mapBuilder.mapNulls( //Eğer Entity sınıfı ise
                Arrays.stream(sourceObject.getClass().getDeclaredAnnotations())
                        .map(annotation -> annotation.annotationType().equals(Entity.class))
                        .map(value -> !value)
                        .reduce(Boolean::logicalOr)
                        .orElse(false)
            );
            mapBuilder.mapNullsInReverse( //Eğer Entity sınıfı ise
                Arrays.stream(destinationObject.getClass().getDeclaredAnnotations())
                        .map(annotation -> annotation.annotationType().equals(Entity.class))
                        .map(value -> !value)
                        .reduce(Boolean::logicalOr)
                        .orElse(false)
            );
            mapBuilder.byDefault().register();
        }
        super.map(sourceObject, destinationObject);

    }

它所做的基本上是创建一个映射器,如果mappins为Entity-> DTO,则该映射器为mapNulls,如果之前未注册,则注册新的映射器。 实际上,此注册可能在其他地方,但这只是PoC,它可以完成工作。

对于实现ConfigurableMapper的示例,您可以检查此链接。 (这实际上是一个Spring可注入映射器示例) https://github.com/dlizarra/orika-spring-integration/blob/master/src/main/java/com/dlizarra/orika/mapper/OrikaBeanMapper.java

(想澄清您的问题,但没有足够的代表发表评论)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM