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

如何使用Dozer将字符串值映射到字符串列表?

丁英韶
2023-03-14

嗨,我尝试将以下Source类映射到以下Destation类。我使用了以下映射以将字符串值映射到列表字符串。它没有正确映射。我需要知道如何使用Dozer将2个字符串值映射到一个目标字符串列表中。

public class SourceClass {

  protected String streetName;
  protected String additionalStreetName;

}

public class Destination {

protected List<String> addressLine;

}

<mapping map-id="newId" >
<class-a>myPackage.SourceClass </class-a>
<class-b>myPackage.Destination</class-b> 

  <field>
    <a>streetName</a>
    <b>addressLine[0]</b>
  </field>
   <field>
    <a>additionalStreetName</a>
    <b>addressLine[1]</b>
  </field> 
</mapping> 

共有3个答案

宗政博文
2023-03-14

您需要在Java中创建一个自定义转换器类。

参考推土机自定义转换器,转到标题新自定义转换器API。

您的转换器类需要像这样扩展DozerConverter

SourceClassToDestinationConverter extends DozerConverter <SourceClass, Destination> implements MapperAware

然后,您必须在自定义转换器配置中定义要用来代替映射器的转换器,如下所示:

<configuration>
    <custom-converters>
        <converter
            type="some.package.converter.SourceClassToDestinationConverter ">
            <class-a>myPackage.SourceClass</class-a>
            <class-b>myPackage.Destination</class-b>
        </converter>
        ...
    </custom-converters>
</configuration>
万俟震博
2023-03-14

为此,您需要使用自定义转换器。

文档将为您提供更全面的理解,但本质上,目前dozer不知道如何将字符串转换为列表,因此您必须告诉它。

自定义转换器将以字符串值作为源,以列表作为目标,并将收到的字符串添加到列表中。

类似于这样的东西:

public class TestCustomConverter extends DozerConverter {

    public NewDozerConverter() {
        super(String.class, List.class);
    }

    public List<String> convertTo(String source, List<String> destination) {
        if (source == null) {
            return new ArrayList<>();
        }
        if (destination == null) {
            destination = new ArrayList<>();
        }

        destination.add(source);

        return destination;
    }

    public String convertFrom(List<String> source, String destination {
        return null;
    }
}

您的映射将如下所示:

<mapping map-id="newId" >
  <class-a>myPackage.SourceClass </class-a>
  <class-b>myPackage.Destination</class-b> 

  <field custom-converter="TestCustomConverter">
    <a>streetName</a>
    <b>addressLine</b>
  </field>
  <field custom-converter="TestCustomConverter">
    <a>additionalStreetName</a>
    <b>addressLine</b>
  </field> 
</mapping> 
岳浩宕
2023-03-14

只需通过Hint标签指定目标列表中对象的类型,让Dozer知道您想要在目标列表中创建的对象类型:

<field>
    <a>streetName</a>
    <b>addressLine[0]</b>
    <b-hint>java.lang.String</b-hint>
</field>
<field>
    <a>additionalStreetName</a>
    <b>addressLine[1]</b>
    <b-hint>java.lang.String</b-hint>
</field>

不需要自定义转换器。

 类似资料:
  • 如何将字符串映射到列表,并将列表映射到字符串? 考虑到我们有以下班级 在Dozer和Orika中,我们可以使用以下代码行轻松映射 如何在MapStruct中进行相同类型的映射?在哪里可以找到有关mapstruct的更多示例?

  • 我有一个字符串格式的日期列表,如下所示: 我需要以这样的方式映射它,所以我将有一个年份字符串的列表——就像这样: 我的想法是修剪字符串的开头,然后将其附加到新的年份列表中。 最有效的方法是什么?

  • 我有下面的结构,我想用MapStruct映射这个。 下面是mapstruct为toDTO方法生成的实现 下面是mapstruct为toEntity方法生成的实现 我的问题是方法只在文本不为空时设置注释。但是方法不检查空文本或空文本。因此,如果我在DTO中获得,它将创建一个新的comment对象并将文本设置为null。如何避免这一点?有人能解释一下这种行为并建议我正确的做法吗?谢了!

  • 问题内容: 我想创建一个字符串映射到实例。这是正确的方法吗? 问题答案: 每当我想使用A时,我都发现切片是正确的选择,例如

  • 我正在研究这样的句子结构: 我现在需要所有可能的组合从字典中形成这个句子,比如:

  • 当我试图将从表t_comment_photo查询的userPhoto映射到java类ToyComment中的列表元素时,我得到了错误。 我试图修复的resultMap是: 我尝试了和,但都不起作用。 怎么把它修好?