【问题标题】:How to map String values to a String list using Dozer?如何使用 Dozer 将字符串值映射到字符串列表?
【发布时间】:2015-09-16 15:44:17
【问题描述】:

您好,我尝试将以下 Source 类映射到以下 Destination 类。我使用以下映射将字符串值映射到列表字符串。它没有正确映射。我需要知道如何使用 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> 

【问题讨论】:

  • 如果您找到了问题的解决方案,您应该将其中一个解决方案标记为正确答案。
  • 您是否阅读了所有答案?有更优雅的方法来解决您的问题而无需创建自定义转换器:)
  • 对于未来的读者 A.Panzer 的回答非常完美!!!!!

标签: java string list mapping dozer


【解决方案1】:

只需通过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>

不需要自定义转换器。

【讨论】:

    【解决方案2】:

    为此,您需要使用custom converter

    文档会给你一个更彻底的理解,但本质上,目前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> 
    

    【讨论】:

    • 我应该在哪里保存“TestCustomConverter”类?在 myPackage 文件夹下或在“dozerMapper.xml”所在的资源文件夹下?
    • 它是一个类,所以无论你想把它放在你的源文件夹中的什么地方。不过,您需要为 dozerMapper.xml 提供完全限定名称,因此如果将其放在 myPackage 中,它将是 &lt;field custom-converter="myPackage.TestCustomConverter"&gt;
    【解决方案3】:

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

    参考 Dozer Custom Converters,转到标题新的自定义转换器 API。

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

    SourceClassToDestinationConverter extends DozerConverter <SourceClass, Destination> implements MapperAware
    

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

    <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>
    

    【讨论】:

    • 公共类 TestConverter 扩展 DozerConverter 实现 MapperAware {
    【解决方案4】:

    这是我想出的答案..

    import java.util.ArrayList;
    import java.util.List;
    
    import org.dozer.DozerConverter;
    import org.dozer.Mapper;
    import org.dozer.MapperAware;
    
    public class TestConverter extends DozerConverter<String, List>
        implements MapperAware {
    
    public TestConverter() {
        super(String.class, List.class);
        // TODO Auto-generated constructor stub
    }
    
    
    @Override
    public void setMapper(Mapper mapper) {
        // TODO Auto-generated method stub
    
    }
    
    @Override
    public List convertTo(String source, List destination) {
        if (source == null) {
             return new ArrayList<String>();
        }
        if (destination == null) {
             destination = new ArrayList<String>();
        }
    
        //destination.getAddressLine().add(source.getAdditionalStreetName());
        destination.add(source);
        return destination;
    }
    
    
    
    @Override
    public String convertFrom(List source, String destination) {
        // TODO Auto-generated method stub
        return null;
    }
    
    }
    

    ===============在dozerMapper.xml下配置========================== =

       <custom-converters>
        <converter 
            type="company.realMap.TestConverter">
            <class-a>desAdv.SourceClass</class-a>
            <class-b>abcReq.Destination</class-b>
        </converter> 
    

    ===============在dozerMapper.xml下映射==========================

      <field custom-converter="myPackage.TestConverter">
        <a>streetName</a>  
        <b>addressLine</b>
        </field>
      <field custom-converter="myPackage.TestConverter">
        <a>additionalStreetName</a>  
        <b>addressLine</b>      
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-06
      • 1970-01-01
      • 1970-01-01
      • 2012-08-21
      • 1970-01-01
      • 2021-08-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多