当前位置: 首页 > 知识库问答 >
问题:

使用自定义转换器在推土机中设置字符串常量

张银龙
2023-03-14

我一直在寻找在推土机映射中设置常量值的解决方案,并且在stackoverflow上阅读了很多关于这个问题的答案。所以我决定使用推土机自定义转换器。

让我澄清一下我的情况。

我有两个具有以下字段的bean:

豆A:

String name;

String phone;

String bankId;

Bean B:

String branch;

String phone;

String name;

String bankId;

Bean B分支字段应始终等于"1111"

因此,我创建了一个自定义转换器:

public class ConstantToTypeConverter extends DozerConverter<String, String> {

    public ConstantToTypeConverter() {
        super(String.class, String.class);
    }

    @Override
    public String convertTo(String source, String destination) {
        if (getParameter().equalsIgnoreCase("TYPE")) {
            return "1111";
        }
        return null;
    }

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

以及以下映射:

<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns="http://dozer.sourceforge.net"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://dozer.sourceforge.net
          http://dozer.sourceforge.net/schema/beanmapping.xsd">
    <mapping type="one-way" map-id="map-test">
        <class-a>BeanA</class-a>
        <class-b>BeanB</class-b>
        <field custom-converter="ConstantToTypeConverter"
               custom-converter-param="TYPE">
            <!-- Can use any existing field of String here, since there is a custom converter -->
            <a>name</a>
            <b>branch</b>
        </field>
    </mapping>
</mappings>

它工作得很好,并将分支值设置为"1111"。但是这种方法看起来很糟糕:

<!-- Can use any existing field of String here, since there is a custom converter -->
                <a>name</a>
                <b>branch</b>

我必须在XML映射中设置一个name字段作为源,才能启动我的自定义转换器,因为Dozer需要源字段和目标字段,即使源字段实际上并不需要。通常,它会使我的代码不清楚并且难以维护。

我想我犯了一个错误,或者以不恰当的方式使用了这种方法。谁能解释一下这个问题吗?

我使用推土机5.5.1

共有1个答案

方通
2023-03-14

除CustomConverter之外的另一个选项是创建初始化bean的BeanFactory。

public class BeanBFactory implements org.dozer.BeanFactory {
    @Override
    public Object createBean(Object source, Class<?> sourceClass, String targetBeanId) {
        return new BeanB(Constants.X, Constants.Y, ...);
    }
}

<mapping>
    <class-a>BeanA</class-a>
    <class-b bean-factory="BeanBFactory">
        BeanB
    </class-b>
</mapping>

您不应该计算代码行数;它可能比硬编码转换要长(至少对于简单bean)。

 类似资料:
  • 请注意:如果这确实是实现我所寻找的目标的唯一方法,那么我会接受基于XML的解决方案,但我更喜欢使用Dozer的Java API的解决方案。 我是推土机的新手,正在尝试了解如何使用其API。它似乎默认为字段级映射(如果字段名称匹配),并允许在字段级映射(基于字段名称)不可能或不符合应用程序需要的情况下使用自定义映射器和转换器。 我有一种情况,我的应用程序将接受一个DTO,例如,

  • 我不确定我是否正确理解推土机映射器中的自定义创建方法。我需要将int类型的bean属性转换为TransTypeCodebook对象实例。但我得到了: 我的TransTypeCodebook课程 映射器部分 我设法通过自定义转换器解决了这个问题,但我不确定我是否理解自定义创建方法的概念,我想知道这个字符串是从哪里来的。有人能解释一下吗?

  • 考虑以下类。如何在不使用自定义转换器的情况下使用Dozer将A类转换为B类? 有人能为上述类提供推土机映射XML吗?

  • 问题内容: 在这个奇怪的例子中,有人创建了一个新类型,它实际上只是一个字符串: 但是,此代码无法编译: 不能在返回参数中使用Foobar(CustomType类型)作为类型字符串 您将如何修复SomeFunction,使其能够返回Foobar的字符串值(“ somestring”)? 问题答案: 将值转换为字符串:

  • 我有一个非常复杂的对象。 我的目标是将问题答案集映射展平,以便将值中的所有列表合并为一个 我没有试图找出如何在Dozer中将所有这些列表合并到一个列表中,我甚至不确定它是否能够做到,而是编写了一个自定义setter。 我假设这意味着Dozer只需读取第一个对象的调查并将其放入makeFlatSurvey,但它读取调查对象上的questionAnswerGroup字段,然后遍历QuestionAns

  • 我有一个NestJSRESTAPI,并将TypeORM与MongoDB一起使用。我想创建一个名为的实体。我从一个基本实体开始,我刚刚读到我应该使用,而不是。 我想知道是否可以用字符串类型的主列替换该对象id列。字段基于特殊模式,例如name字段 我超棒的项目 将导致 我很棒的项目 对于id字段。当然,我使用了生成的,但是我必须传递一个自定义字符串,而不是。目前这是不可能的,因为文档说 可以是24字