0

我正在使用 Orika,并且有时需要映射空值(源 bean 上的空值应该用空值覆盖目标 bean 上的值)以及在其他情况下忽略空值(源 bean 上的空值不会覆盖目标 bean 上的现有值) .

Orika 可以使用 mapNulls(true/false) 方法来支持这一点。所以我想创建两个独立的映射器工厂,并在一个上执行 mapNulls(false),在另一个上执行 mapNulls(true)。然后我会在两个工厂上重复所有相同的类映射配置。然后我可以在运行时选择我需要的合适的工厂,这取决于我是否要映射空值。

但是,文档表明创建这些工厂和外观很昂贵,所以这样做似乎很浪费,并且需要我有 2 个工厂和 2 个外观映射器,所有相同的类映射重复两次。

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

4

1 回答 1

1

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

我已经在其中编写了一个 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 的示例,您可以查看此链接。(这实际上是一个弹簧可注入映射器示例)https://github.com/dlizarra/orika-spring-integration/blob/master/src/main/java/com/dlizarra/orika/mapper/OrikaBeanMapper.java

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

于 2016-06-28T20:10:01.737 回答