- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
免责声明:这里已经提出了同样的问题Mapping deep properties with intermediate collections in dozer ,但它没有公认的答案(也没有适合我的情况的正确答案)。
所以问题。我有一个由 ComplexObject 组成的领域,如下所示
public class ComplexObject {
private Set<AnotherComplexObject> inner;
... //other fields, setters and getters
}
public Class AnotherComplexObject {
private String property;
... //other fields, setters and getters
}
现在,我正在映射 ComplexObject
至 Target
,其中 Target 有一个 Set<String>
属性(property)。
public class Target {
private Set<String> targetString;
... //other fields, setters and getters
}
我想将每个 ComplexObject inner.property 映射到一个 Target targetString。语义上看起来像的东西(这当然不起作用,属性不是 Set 的成员并且 Dozer 生成 MappingException):
<mapping>
<class-a>ComplexObject</class-a>
<class-b>Target</class-b>
<field>
<a>inner.property</a>
<b>targetString</b>
</field>
</mapping>
如果我修改 toString
就可以实现我的目标AnotherComplexObject
的方法|到
public class AnotherComplexObject {
public String toString(){
return property;
}
}
然后,Dozer 将检测源 Set 是“类型”AnotherComplexObject,而目标 Set 是 String,并将在转换期间使用方法 toString。不幸的是,这不是一个完整的解决方案,因为我需要在我的 POJO 中使用一个方法来让 Dozer 进行转换。
有用的是编写一个自定义转换器,它覆盖转换方法以检查源是否是一个集合,然后假设集合中的对象是 AnotherComplexObject 并从这一点开始进行转换,但不知何故我觉得这不是最好的也不是更多优雅的解决方案。
关于如何解决这个问题还有其他想法吗?
最佳答案
也许是我的 answer对你有用:
我想,你可以写这样一个映射
<mapping>
<class-a>Baz</class-a>
<class-b>Target</class-b>
<field>
<a>foos</a>
<b>fooStrings</b>
</field>
</mapping>
<custom-converters>
<converter type="CustomFooConverter">
<class-a>
Foo
</class-a>
<class-b>
String
</class-b>
</converter>
</custom-converters>
并实现 CustomFooConverter 以获取 foo 的字符串字段并将其作为字符串返回。
我想你可以发布一个功能请求来支持映射到原语
<mapping>
<class-a>Foo</class-a>
<class-b>String</class-b>
<field>
<a>string</a>
</field>
</mapping>
进入推土机 GitHub
关于java - Dozer 深度映射 Set<ComplexObject> 到 Set<String>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14212708/
免责声明:这里已经提出了同样的问题Mapping deep properties with intermediate collections in dozer ,但它没有公认的答案(也没有适合我的情况
我是一名优秀的程序员,十分优秀!