复杂的Java bean映射

时间:2015-01-05 18:13:33

标签: 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 =&gt; DestDTO.name和Source.desc =&gt; DestDTO.desc,好的很容易。
  • 根据代码在GenericDetailsDTO实例中分组详细信息实例。例如,具有“a”作为代码的Details实例都被收集到一个GenericDetailsDTO实例中,该实例具有“a”作为代码。
  • 然后将每个Details实例映射为相应GenericDetailsDTO实例的列表详细信息的项。这种映射也很复杂:
    • Details.type =&gt; DetailsDTO.type,还好。
    • 对于Details实例的属性集的每个“Attribute”,将具有正确类型(String,Boolean或其他)的“value”字段映射到DetailsDTO实例的字段,该实例具有名称的值字段“name”的相同“属性”实例。

我尝试过JMapper,但我无法实现这样的解决方案。

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

在一个完美的世界中,我还想尽可能多地使用注释/ api配置并避免XML配置。如果映射器实例也可以通过Spring API(非XML再次)注入bean,那么它将是一个非常美妙的世界。

所以我的问题是:你有任何建议吗?或者你能否就这个问题向我推荐一个图书馆?

感谢您的帮助。

PS:对不起,如果不是很清楚,但很难用几句话来解释。请不要犹豫,再提出更多解释。

1 个答案:

答案 0 :(得分:0)

我不太清楚你的意思是什么,但我试着用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;
}

哪里“??”是我不理解的。