2010-06-10 67 views
1

我想用推土机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对象中。

我已经试过这样的映射:

<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) 

我该如何映射这使其作品?

回答

2

问题解决...

  • 是-入店允许一个对象的访问无论改性剂和getter/setter方法的存在

  • “点(对于使用JAXB生成对象必需)被更新“符号来深工作映射访问嵌套对象

结合使用这两种是一种功能,不给料器(工作也许它在一个较新的VERS离子)

溶液... 修改,使得不需要深映射XSD。这不是我的理想解决方案,但它不是写一个自定义转换器为每个对象

+0

你有没有getter和setter使用JAXB生成的对象?我有 – Rytek 2012-10-18 07:47:12

0

我猜想,存取(的getter/setter)失踪。 顺便说一下,我认为你还需要为DetailsObject提供一个空的构造函数,所以推土机可以实例化它。

+0

DetailsObject是使用JAXB生成的。它的唯一方法是: public List getDetails(){ if(details == null){ details = new ArrayList (); } return this.details; } 我不想更改生成的代码。有什么解决办法吗? – user363900 2010-06-10 21:08:49

+1

那么鉴于你的映射不能工作,因为你的目标类没有提供setter。但是...也许你可以看看这里:http://dozer.sourceforge.net/documentation/xmlbeans.html 它解释了如何映射xmlbeans以及jaxb对象 – 2010-06-11 19:36:06

0
<b is-accessible="true">detObj.details</b> 

应与

<b is-accessible="true">DetailsObject.details</b> 
+1

请尝试格式化答案并添加一些详细信息 – Sid 2012-11-29 13:05:15

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”不是必需的。希望它可以帮助

0

虽然它似乎你cannnot使用“是可访问”和点符号一起的另一种方法是打破你深深映射成更小的映射。

我们就遇到了这个情况与JAX-WS生成的代码。你有没有setter方法的列表,在我们的案例中是深嵌的。我们通过简单地将大型深度映射分解为更小的映射来找到我们的解决方案,这些映射“走向”我们想要的方式。我想在我的博客这里要说明这一点:

http://btarlton.blogspot.com/2014/08/dozer-deep-nestinga-different-approach.html

但问题是把由较小映射走对象树和使用是可访问=“真”在必要的时候,没有二传手访问列表使用“this”作为属性名称以继续传递源代码。

希望这会有所帮助!

0

总结有此问题 1)使用JAXB撑着,使制定者由纳文 2讨论下面的选项)采用的是可访问的这种性质

我相信使用第一种方法不必要地暴露于集合制定者/列表,因为你可以用空值来设置它们。

我们决定启用is-accessible这些字段(而不是整个类)以避免任何副作用。

我已经讨论了解决方案Dozer Mapping Class level is-accessible