繁体   English   中英

复杂的Java Bean映射

[英]Complex Java bean mapping

我需要找到一种将实体映射到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实例中的代码对Group Details实例进行分组。 例如,将具有“ a”作为代码的Details实例全部收集到具有“ a”作为代码的单个GenericDetailsDTO实例中。
  • 然后,每个Details实例都映射为适当的GenericDetailsDTO实例的列表详细信息的项目。 此映射也很复杂:
    • Details.type => DetailsDTO.type,也很容易。
    • 对于Details实例的属性集的每个“ Attribute”,将具有正确类型(字符串,布尔值或其他)的“ value”字段映射到DetailsDTO实例的字段,其名称为“ name”字段的值属于同一“属性”实例。

我尝试了JMapper,但无法实现这种解决方案。

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

在理想的情况下,我还想尽可能多地使用批注/ api配置并避免使用XML配置。 而且,如果还可以通过Spring API(再次不是XML)将mapper实例作为bean注入,那将真的是一个美好的世界。

所以我的问题是:您对此有何建议或可以向我推荐一个图书馆以解决此问题?

谢谢你的帮助。

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;
}

哪里“?” 是因为我不了解。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM