首页 > 解决方案 > 推土机:成功转换后用源值覆盖的字段

问题描述

我在使用 Dozer 时遇到了一种非常奇怪的行为。我有一个具有 2 个属性的复杂类型,需要合并到一个字符串中,这没什么疯狂的。

这是我的转换器:

@Component
public class CatalogEntryRequestRDToStringConverter extends DozerConverter<CatalogEntryRequestRD, String> {

    public CatalogEntryRequestRDToStringConverter() {
        super(CatalogEntryRequestRD.class, String.class);
    }

    public CatalogEntryRequestRDToStringConverter(Class<CatalogEntryRequestRD> prototypeA, Class<String> prototypeB) {
        super(prototypeA, prototypeB);
    }

    @Override
    public String convertTo(CatalogEntryRequestRD source, String destination) {
        if (source != null) {
            return ConverterUtil.concatenateCodeAndVersion(getParameter(), source.getCode(), source.getVersion());
        }
        return null;
    }

    @Override
    public CatalogEntryRequestRD convertFrom(String source, CatalogEntryRequestRD destination) {
        return null;
    }

这是我映射这些类型的方法:

mapping(StartBorderRequest.class, StartBorderRequestMessageType.class)
        .fields("request.scopeModifiers", "scopeModifiers")
        .fields("request.collectedData", "collectedData")
        .fields("request.selectedResponseData", "selectedResponseData");


mapping(com.test.types.CollectedDataRequestType.class, com.test.message.CollectedDataRequestType.class)
    .fields("tcnType", "tcnType", fieldMappingBuilder -> {
        fieldMappingBuilder.customConverter("CatalogEntryRequestRDToStringConverter");
        fieldMappingBuilder.customConverterParam("tcnTypeId");
    });

转换器工作。它被正确调用并且转换成功。但是,经过一些调试后,我注意到在映射过程结束时再次调用了目标字段的 set 方法,并使用 CatalogEntryRequestRD 的 toString() 方法的值。因此,我正确转换的字段被 source.toString() 覆盖。它猜想这一定与 Dozer 如何创建要映射的字段列表有关?

有没有人经历过这样的事情?

提前致谢

标签: javaspringmappingjavabeansdozer

解决方案


推荐阅读