[英]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.