首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用org.modelmapper.modelmapper进行对象映射

使用org.modelmapper.modelmapper进行对象映射
EN

Stack Overflow用户
提问于 2017-12-31 17:49:30
回答 1查看 1.4K关注 0票数 1

我有两个对象:

代码语言:javascript
复制
@Setter
@Getter
public class Agent {
    public int userID;
    public String name;
    public boolean isVoiceRecorded;
    public boolean isScreenRecorded;
    public boolean isOnCall;
    public LocalDateTime startEventDateTime;
}
public class AgentLine {
    public int userID;
    public String name;
    public boolean isVoiceRecorded;
    public boolean isScreenRecorded;
    public boolean isOnCall;
    public String startEventDateTime;
}

我想在AgentLine到代理之间进行映射。由于Localdatetime转换,我不能使用默认映射。我已经定义了:

代码语言:javascript
复制
    @Bean
    ModelMapper getModelMapper() {
        ModelMapper modelMapper = new ModelMapper();
        Converter<AgentLine, Agent> orderConverter = new Converter<AgentLine, Agent>() {
            @Override
            public Agent convert(MappingContext<AgentLine, Agent> mappingContext) {
                AgentLine s = mappingContext.getSource();
                Agent d = mappingContext.getDestination();
/*                d.userID = s.userID;
                d.name = s.name;*/
                d.startEventDateTime = LocalDateTime.parse(s.startEventDateTime, DateTimeFormatter.ISO_LOCAL_DATE_TIME);
                return d;
            }
        };
        modelMapper.addConverter(orderConverter);
        return modelMapper;
    }

为了使用它:

代码语言:javascript
复制
AgentLine line;
@Autowired
private ModelMapper modelMapper;
Agent agent = modelMapper.map(line, Agent.class);

它可以工作,但我不想在convert方法中指定所有代理属性,我想指定startEventDateTime转换,其余属性将在默认情况下映射。

此外,我还试图定义:

代码语言:javascript
复制
PropertyMap<AgentLine, Agent> orderMap = new PropertyMap<AgentLine, Agent>() {
                @Override
                protected void configure() {
                    map().setName(source.name);
                }
            };
modelMapper.addMappings(orderMap);

但是,在映射中,您不能处理日期转换。如果我为映射器PropertyMap和转换器定义,PropertyMap将被忽略。

我不想在convert方法中指定所有代理属性,我想指定startEventDateTime转换,其余属性将默认映射。

EN

回答 1

Stack Overflow用户

发布于 2018-01-04 16:53:21

不要使用Converter映射复杂对象。您应该使用TypeMap来实现这些目的。使用Converter进行自定义转换(对于从StringLocalDateTime的情况)。

代码语言:javascript
复制
ModelMapper modelMapper = new ModelMapper();    
Converter<String, LocalDateTime> dateTimeConverter = ctx -> ctx.getSource() == null ? null : LocalDateTime.parse(ctx.getSource(), DateTimeFormatter.ISO_LOCAL_DATE_TIME);
modelMapper.typeMap(AgentLine.class, Agent.class)
        .addMappings(mapper -> mapper.using(dateTimeConverter).map(AgentLine::getStartEventDateTime, Agent::setStartEventDateTime));
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48041483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档