我需要找到一个将实体映射到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;
}
我想要做的映射如下:
我尝试过JMapper,但我无法实现这样的解决方案。
我已经能够通过使用Dozer来实现它,但我想避免使用这个库,因为它的性能很慢(根据网上的各种文章,如http://www.christianschenk.org/blog/java-bean-mapper-performance-tests/)。
在一个完美的世界中,我还想尽可能多地使用注释/ api配置并避免XML配置。如果映射器实例也可以通过Spring API(非XML再次)注入bean,那么它将是一个非常美妙的世界。
所以我的问题是:你有任何建议吗?或者你能否就这个问题向我推荐一个图书馆?
感谢您的帮助。
PS:对不起,如果不是很清楚,但很难用几句话来解释。请不要犹豫,再提出更多解释。答案 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;
}
哪里“??”是我不理解的。