尝试不将空字段设置为 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
(想澄清您的问题,但没有足够的代表发表评论)