簡體   English   中英

如何使用Dozer將String值映射到String列表?

[英]How to map String values to a String list using Dozer?

您好我嘗試將以下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> 

只需通過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還不知道如何將字符串轉換為列表,因此您必須告訴它。

您的自定義轉換器將String值作為源並將List作為目標,並將其收到的字符串添加到列表中。

有點像這樣:

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> 

您需要在Java創建自定義轉換器類。

參考Dozer自定義轉換器 ,轉到標題New Custom Converter API。

你的轉換器類需要像這樣擴展DozerConverter

SourceClassToDestinationConverter extends DozerConverter <SourceClass, Destination> implements MapperAware

然后,您必須在custom-converters配置中custom-converters要用於代替映射器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>

這就是我想出的答案..

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> 

在==========================

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM