【问题标题】:Map String Array into a POJO with Dozer使用 Dozer 将字符串数组映射到 POJO
【发布时间】:2019-07-26 00:47:48
【问题描述】:

我正在尝试使用 Dozer 将 List<String[]> 转换为 List<Object>,但无法使用映射器 API configuration 将索引值映射到属性字段。

如何将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
}

【问题讨论】:

  • 答案非常适合您的问题!你能把你的反馈给我吗?谢谢!

标签: java pojo dozer


【解决方案1】:

它与以下配置完美配合;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-17
    • 1970-01-01
    • 2012-01-06
    • 2012-01-23
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 2019-08-10
    相关资源
    最近更新 更多