簡體   English   中英

使用推土機將字符串數組映射到POJO

[英]Map String Array into a POJO with Dozer

我正在嘗試使用推土機將List<String[]>轉換為List<Object>但無法使用mapper API配置將索引值映射到屬性字段。

如何將String[]的成員映射到單個對象字段中,而每個索引都針對特定字段? (例如[0] -> name[1] -> role

DozerBeanMapper mapper = new DozerBeanMapper();
BeanMappingBuilder builder = new BeanMappingBuilder() {
    @Override
    protected void configure() {
        mapping(String[].class, User.class)
            .fields(this_(), "name"); // HOW do I specify index?**
    }
};
mapper.addMapping(builder);

List<String[]> users = new ArrayList<>();
String[] user1 = {"Jill", "SDE"};
String[] user2 = {"Jack", "PM"};
users.add(user1);
users.add(user2);
List<User> userList = mapObjects(mapper, users, User.class);

mapObjects()在哪里;

private static <T1, T2> List<T2> mapObjects(DozerBeanMapper mapper, List<T1> sourceList, Class<T2> destinationClazz) {
    try {
        return sourceList.stream()
                .map(i -> mapper.map(i, destinationClazz))
                .collect(Collectors.toList());
    } catch (Exception e) {
        ...
    }
    return new ArrayList<>();
}

User類;

class User {
    String name;
    String role;

    // getter & setter
}

它與以下配置完美配合;

DozerBeanMapper mapper = new DozerBeanMapper();
BeanMappingBuilder builder = new BeanMappingBuilder() {
    @Override
    protected void configure() {
        mapping(String[].class, User.class)
                .fields(this_(), "name", FieldsMappingOptions.customConverterId("arrToName"))
                .fields(this_(), "role", FieldsMappingOptions.customConverterId("arrToRole"));
    }
};
final Map<String, CustomConverter> customConverterMap = new HashMap<>();
customConverterMap.put("arrToName", new ArrToNameConverter());
customConverterMap.put("arrToRole", new ArrToRoleConverter());
mapper.setCustomConvertersWithId(customConverterMap);
mapper.addMapping(builder);

利用自定義轉換器將String[]映射到namerole字段的邏輯,這些轉換器針對輸入String[]的特定索引。 使用dozer ,您基本上可以定義自定義轉換器並為其指定一個ID,然后在字段映射FieldsMappingOptions.customConverterId("{id}")使用這些ID對其進行引用。

其中ArrToNameConverter ;

public class ArrToNameConverter extends DozerConverter<String[], String> {

    public ArrToNameConverter() {
        super(String[].class, String.class);
    }

    @Override
    public String convertTo(String[] strings, String user) {
        return strings[0];
    }

    @Override
    public String[] convertFrom(String user, String[] strings) {
        return new String[0];
    }
} 

ArrToRoleConverter ;

public class ArrToRoleConverter extends DozerConverter<String[], String> {

    public ArrToRoleConverter() {
        super(String[].class, String.class);
    }

    @Override
    public String convertTo(String[] strings, String user) {
        return strings[1];
    }

    @Override
    public String[] convertFrom(String user, String[] strings) {
        return new String[0];
    }
} 

使用上面的mapper ,我可以得到以下結果;

[User(name=Jill, role=SDE), User(name=Jack, role=PM)]

暫無
暫無

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

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