java - 复杂的 Java bean 映射

标签 java spring mapping javabeans dto

我需要找到一个将实体映射到 DTO 的解决方案。

我知道有很多库可以做到这一点,但我需要做的转换非常复杂,我还没有找到满意的解决方案。

我拥有的实体如下所示:

public class Source {
    private String name;
    private String desc;
    private Set<Details> details = new HashSet<Details>();
}

public class Details {
    private String code;
    private String type;
    private Set<Attribute> attributes = new HashSet<Attribute>();
}

public class Attribute {
    private String name;
    private String value;
}

为了清楚起见,我删除了持久性注释和 getter/setter 并省略了一些字段。

还有 DTO:

public class DestDTO {
    private String name;
    private String desc;
    private List<GenericDetailsDTO> genericDetails;
}

public class GenericDetailsDTO {
    private String code;
    private List<DetailsDTO> details;
}

public class DetailsDTO {
    private String type;
    private String field1;
    private Boolean field2;
    private Integer field3;
}

我想做的映射如下:

  • Source.name => DestDTO.name 和 Source.desc => DestDTO.desc,很简单。
  • 根据代码对 GenericDetailsDTO 实例中的详细信息实例进行分组。例如,代码为“a”的 Details 实例全部收集到代码为“a”的单个 GenericDetailsDTO 实例中。
  • Details 的每个实例然后被映射为相应 GenericDetailsDTO 实例的列表详细信息的项目。这个映射也很复杂:
    • Details.type => DetailsDTO.type,好吧也简单。
    • 对于 Details 实例的属性集的每个“Attribute”,将具有正确类型(String、Boolean 或其他)的“value”字段映射到 DetailsDTO 实例的字段,其名称为同一“属性”实例的字段“名称”。

我尝试了 JMapper,但未能实现这样的解决方案。

我已经能够通过使用 Dozer 来做到这一点,但我想避免使用这个库,因为它的性能很慢(根据网络上的各种文章,例如 http://www.christianschenk.org/blog/java-bean-mapper-performance-tests/)。

在一个完美的世界里,我也想尽可能的使用annotation/api配置,避免XML配置。如果 mapper 实例也可以通过 Spring API(再次不是 XML)作为 bean 注入(inject),那真是一个美好的世界。

所以我的问题是:您有什么建议吗?或者您能为我推荐一个图书馆来解决这个问题吗?

感谢您的帮助。

PS:如果不是很清楚请见谅,三言两语很难说清楚。请不要犹豫,询问更多解释。

最佳答案

我不太明白你的意思,但我试着用JMapper给你一个解决方案。

源字段:

@JMap   private String name;
@JMap   private String desc;
@JMap("genericDetails")
private Set<Details> details = new HashSet<Details>();

详细信息字段:

@JMap   private String code;
@JMap("details")
private String type;
@JMap("details")
private Set<Attribute> attributes = new HashSet<Attribute>();

@JMapConversion(from="type",to="details",type=Type.STATIC)
public static List<DetailsDTO> typeMap(List<DetailsDTO> destination, String sourceType){
    for (DetailsDTO detailsDTO : destination) 
        detailsDTO.setType(sourceType);

    return destination;
}

@JMapConversion(from="attributes",to="details",type=Type.STATIC)
public static List<DetailsDTO> detailsMap(List<DetailsDTO> destination, Set<Attribute> attributes){

        // ??
    return destination;
}

哪里有“??”是为了我不明白的。

关于java - 复杂的 Java bean 映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27785397/

相关文章:

java - 将值从一个 Activity 返回到另一个 Activity

java.lang.NullPointerException - 注销时出错 Android

java - 数据访问对象 (DAO) 中的方法应该抛出还是捕获其异常?

spring - 如何 JUnit 测试 Spring Autowiring 构造函数?

python - SQLAlchemy 经典映射模型到分片 Postgres 数据库

python - elasticsearch映射字段[name]上的属性[fields]的预期映射,但是得到了一个类java.lang.String

java - Java 中 while 循环内的 Try-Catch

java - 如何从 Java 应用程序使用 Google 日历?

java - @ResponseBody\npublic ReturnType .. 和 public @ResponseBody ReturnType 之间的区别?

javascript - 映射 csv 以在 React 中显示数组中的每个项目