【问题标题】:Dozer Mapper is not mapping composed nested fieldsDozer Mapper 没有映射组合的嵌套字段
【发布时间】:2015-11-22 09:29:24
【问题描述】:

正在使用的工具/框架:

  • JDK 1.7
  • Spring 3.2.5.RELEASE
  • Dozer 5.5.1

类:BaseModel.java

package com.demo.model;
public class BaseModel {
  protected Long createdBy;
  protected Timestamp createdTimestamp;
  protected Long updatedBy;
  protected Timestamp updatedTimestamp;
  protected Long revision;
  // ... Getters/Setters
}

类:Author.java

public class Author {
  private BaseModel baseModel;
  private Long id;
  private String firstName;
  private String lastName;

  // Getter of baseModel
  public BaseModel getBaseModel() {
    return baseModel == null ? new BaseModel() : baseModel;
  }
  // ... Other Getters/Setters
}

类:BasePojo.java

package com.demo.web.pojo;
public class BasePojo {
  protected Long createdBy;
  protected Timestamp createdTimestamp;
  protected Long updatedBy;
  protected Timestamp updatedTimestamp;
  protected Long revision;
  // ... Getters/Setters
}

类:AuthorPojo.java

package com.demo.web.pojo;
public class AuthorPojo extends BasePojo {
  private Long id;
  private String firstName;
  private String lastName;
  // Getters/Setters
}

类:SpringConfig.java

@Configuration
@EnableAspectJAutoProxy(proxyTargetClass = true)
@ComponentScan("com.demo")
public class SpringConfig {

}

类:DemoDozerMapper.java

@Component("demoDozerMapper")
@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
public class DemoDozerMapper extends DozerBeanMapper {
  @PostConstruct
  public void init() {
  logger.info("PostConstruct called....");
    this.initMappings();
  }

  private void initMappings() {
  final BeanMappingBuilder authorMappingBuilder = new BeanMappingBuilder() {
    @Override
    protected void configure() {
      mapping(Author.class, com.demo.web.pojo.Author.class, 
           TypeMappingOptions.mapId("authorMap"),
           TypeMappingOptions.mapNull(true), TypeMappingOptions.oneWay())
                .fields("baseModel.createdBy", "createdBy")
                .fields("baseModel.createdTimestamp", "createdTimestamp")
                .fields("baseModel.updatedBy", "updatedBy")
                .fields("baseModel.updatedTimestamp", "updatedTimestamp");
            }
        };

        addMapping(authorMappingBuilder);
    }
}

类:Demo.java

public class Demo {
  public static void main(String[] args) {
    final ApplicationContext springAppContext = new AnnotationConfigApplicationContext(SpringConfig.class);
    final Mapper dozerMapper = springAppContext.getBean("demoDozerMapper", DemoDozerMapper.class);

    final Author authorModel = new Author();
    authorModel.getBaseModel().setCreatedBy(Long.valueOf(1L));
    authorModel.getBaseModel().setCreatedTimestamp(new Timestamp(System.currentTimeMillis()));
    authorModel.setFirstName("First");
    authorModel.setLastName("Last");
    authorModel.setId(Long.valueOf(21101L));

    final com.demo.web.pojo.Author author = new com.demo.web.pojo.Author();
    dozerMapper.map(authorModel, author);
    System.out.println("Author Pojo: " + author);
  }
}

输出

Author Pojo: AuthorPojo {id=21101, firstName=First, lastName=Last, createdBy=null, createdTimestamp=null, updatedBy=null, updatedTimestamp=null, revision=null}

createdTimestampcreatedBy 字段没有从模型映射到 pojo。我做错什么了吗?有人可以帮忙吗?

【问题讨论】:

  • 看起来您从未在authorModel 上设置baseModel 对象,因此Author.getBaseModel() 每次调用getter 时都会返回一个BaseModel 的新实例,但该实例永远不会在正在转​​换的 Author 对象上设置。如果您显式创建BaseModel 的实例并在其上设置createdBycreatedTimestamp,然后在Demo.java 中的authorModel 对象上设置该实例,这行得通吗?
  • 嗨@IanA,我尝试了您的方法(明确创建了BaseModel 的实例,然后在其中设置这些createdBycreatedTimestamp,然后将其设置为authorModel;它仍然不起作用。

标签: java spring spring-java-config dozer


【解决方案1】:

我对上面的评论又看了一遍。除了更改在authorModel 上设置baseModel 的方式外,您还需要确保调用映射器时传递与您在DemoDozerMapper.java 中定义的映射相对应的ID(即authorMap) -有关 Dozer 中基于上下文的映射的详细信息,请参阅 here

修改后的 Demo.java 应该是这样的:

类:Demo.java

public class Demo {
  public static void main(String[] args) {
    final ApplicationContext springAppContext = new AnnotationConfigApplicationContext(SpringConfig.class);
    final Mapper dozerMapper = springAppContext.getBean("demoDozerMapper", DemoDozerMapper.class);

    final Author authorModel = new Author();

    // Ensure base model is set
    BaseModel baseModel = new BaseModel();
    baseModel.setCreatedBy(Long.valueOf(1L));
    baseModel.setCreatedTimestamp(new Timestamp(System.currentTimeMillis()));
    authorModel.setBaseModel(baseModel);

    authorModel.setFirstName("First");
    authorModel.setLastName("Last");
    authorModel.setId(Long.valueOf(21101L));

    final AuthorPojo author = new AuthorPojo();

    // Select the appropriate case to use
    dozerMapper.map(authorModel, author, "authorMap");
    System.out.println("Author Pojo: " + author);
  }
}

修改后的输出

Author Pojo: AuthorPojo [id=21101, firstName=First, lastName=Last, createdBy=1, createdTimestamp=2015-11-26 10:07:31.501, updatedBy=null, updatedTimestamp=null, revision=null]

【讨论】:

  • 谢谢@IanA,这行得通。我已接受此作为我问题的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多