我正在尝试使用dozer 4.1在类之间进行映射。我有一个类似于这样的源类:
public class initRequest{
protected String id;
protected String[] details
}
我有一个如下所示的目标类:
public class initResponse{
protected String id;
protected DetailsObject detObj;
}
public class DetailsObject{
protected List<String> details;
}
基本上我希望将details数组中的字符串填充到Details对象的List中。
我尝试过这样的映射:
<mapping wildcard="true" >
<class-a>initRequest</class-a>
<class-b>initResponse</class-b>
<field>
<a is-accessible="true">details</a>
<b is-accessible="true">detObj.details</b>
</field>
</mapping>
但是我收到了这个错误:
Exception in thread "main" net.sf.dozer.util.mapping.MappingException: java.lang.NoSuchFieldException: detObj.details
at net.sf.dozer.util.mapping.util.MappingUtils.throwMappingException(MappingUtils.java:91)
at net.sf.dozer.util.mapping.propertydescriptor.FieldPropertyDescriptor.<init>(FieldPropertyDescriptor.java:43)
at net.sf.dozer.util.mapping.propertydescriptor.PropertyDescriptorFactory.getPropertyDescriptor(PropertyDescriptorFactory.java:53)
at net.sf.dozer.util.mapping.fieldmap.FieldMap.getDestPropertyDescriptor(FieldMap.java:370)
at net.sf.dozer.util.mapping.fieldmap.FieldMap.getDestFieldType(FieldMap.java:103)
at net.sf.dozer.util.mapping.util.MappingsParser.processMappings(MappingsParser.java:95)
at net.sf.dozer.util.mapping.util.CustomMappingsLoader.load(CustomMappingsLoader.java:77)
at net.sf.dozer.util.mapping.DozerBeanMapper.loadCustomMappings(DozerBeanMapper.java:149)
at net.sf.dozer.util.mapping.DozerBeanMapper.getMappingProcessor(DozerBeanMapper.java:132)
at net.sf.dozer.util.mapping.DozerBeanMapper.map(DozerBeanMapper.java:94)
我如何映射它以使其有效?
答案 0 :(得分:3)
这对我有用。我使用的是5.2.1版本
<mapping wildcard="true" >
<class-a>initRequest</class-a>
<class-b>initResponse</class-b>
<field>
<a>details</a>
<b is-accessible="true">detObj.details</b>
</field>
</mapping>
请注意,不需要“is-accessable”。希望它有所帮助
答案 1 :(得分:2)
问题解决了......
is-accesible允许更新对象而不管访问修饰符和getter / setter的存在(对于使用JAXB生成的对象至关重要)
深度映射的“点”表示法用于访问嵌套对象
将两者结合起来是一个在Dozer中不起作用的功能(可能是在较新版本中)
...溶液 修改xsd,使得不需要深度映射。这不是我理想的解决方案,但它比为每个对象编写自定义转换器更好
答案 2 :(得分:1)
对于JaxB,使用可以下载并使用该插件生成setter。有关详细信息,请参阅此链接https://jaxb2-commons.dev.java.net/collection-setter-injector/
答案 3 :(得分:0)
我猜想缺少访问者(getter / setter)。 顺便说一下,我认为你还需要为DetailsObject提供一个空的构造函数,这样dozer就可以实现它。
答案 4 :(得分:0)
<b is-accessible="true">detObj.details</b>
应替换为
<b is-accessible="true">DetailsObject.details</b>
答案 5 :(得分:0)
虽然看起来你似乎无法使用“is-accessible”和点符号,但另一种方法是将你的深度映射分解为更小的映射。
我们使用JAX-WS生成的代码遇到了这种情况。你有没有setter方法的列表,在我们的例子中是深度嵌套的。我们通过简单地将大型深度映射分解为更小的映射来找到我们的解决方案,这些映射“走”了我们想要的方式。我试着在我的博客中解释这个:
http://btarlton.blogspot.com/2014/08/dozer-deep-nestinga-different-approach.html
但诀窍是通过较小的映射遍历对象树,并在必要时使用is-accessible =“true”来访问没有setter的列表,并使用“this”作为属性名称以继续传递源。 / p>
希望这有帮助!
答案 6 :(得分:0)
总结一下,此问题有以下选项 1)使用JaxB插件来启用Naveen讨论的setter 2)对于此类属性,可以使用
我认为使用第一种方法会不必要地为集合/列表公开setter,因为您可能会将它们设置为null。
我们决定为这些字段(而不是整个类)启用is-accessible,以避免任何副作用。
讨论了解决方案