2011-12-28 73 views
0

我在映射层次结构时遇到了Java-Castor问题。谢谢你的时间。Castor:如何映射Java层次结构

我有这个XML文件:

<RESULT> 
    <RESULTCODE>OK</RESULTCODE> 
    <ERRORS /> 
    <COMPANIES> 
    <COMPANY VD="107795641" NAME="COMPANYA" 
    RATING="" CIF="ABCD3435" ID="7671" NUM="0" /> 
    <COMPANY VD="102167561" NAME="COMPANYB" 
    RATING="" CIF="ABCD1234" ID="6642" NUM="1" /> 
    </COMPANIES> 
</RESULT> 

这个Java层次:

public class RentedWSResult 
{ 
    private boolean success; 

    private List<RentedWSResultError> errors; 
} 

public class GetCompaniesRentedWSResult extends RentedWSResult 
{ 
    private List<RentedCompany> rentedCompanies; 
} 

而且这些蓖麻映射:

<mapping> 
    <class name="RentedWSResult"> 
    <map-to xml="RESULT" /> 
    <field name="success" type="string" handler="BooleanStringHandler"> 
     <bind-xml name="RESULTCODE" /> 
    </field> 
    <field name="errors" type="RentedWSResultError" collection="arraylist"> 
     <bind-xml name="ERROR" location="ERRORS" /> 
    </field> 
    </class> 
</mapping> 

<mapping> 
    <include href="RentedWSResultMarshallConfig.xml"/> 
    <class name="GetCompaniesRentedWSResult" > 
    <field name="rentedCompanies" type="RentedCompany" collection="arraylist"> 
     <bind-xml name="COMPANY" location="COMPANIES" /> 
    </field> 
    </class> 
</mapping> 

它不工作,收到此错误:

Unable to find FieldDescriptor for 'COMPANIES' in ClassDescriptor of RESULT 
+0

忘了提及为单个类映射所有字段(GetCompaniesRentedWSResult)很好地工作。这只是映射层次结构中缺少的东西。 – user309949 2011-12-28 15:51:23

回答

1

映射文件中的类之间没有关系。

随着你提供的信息我把一个映射工作。它假定您的RentedWSResult是您的其他元素的容器类。

<mapping> 
    <include href="GetCompaniesRentedWSResultBinding.xml"/> 

    <class name="RentedWSResult"> 
     <map-to xml="RESULT" /> 
     <field name="success" type="string"> 
      <bind-xml name="RESULTCODE" /> 
     </field> 

     <field name="rentedCompanies" type="GetCompaniesRentedWSResult"> 
      <bind-xml name="COMPANIES" /> 
     </field> 
    </class> 

</mapping> 

<mapping> 
    <class name="GetCompaniesRentedWSResult" > 
     <field name="rentedCompanies" type="RentedCompany" collection="arraylist"> 
      <bind-xml name="COMPANY" /> 
     </field> 
    </class> 

    <class name="RentedCompany" > 
    <field name="vd" type="string"> 
      <bind-xml name="vd" node="attribute" /> 
     </field> 

     <field name="name" type="string"> 
      <bind-xml name="name" node="attribute"/> 
     </field> 

     <field name="rating" type="string"> 
      <bind-xml name="rating" node="attribute"/> 
     </field> 

    </class> 
</mapping> 
+0

谢谢你的回答,Brian。好的方法。 问题是,我想在两个单独的映射文件中做这件事,一个用于'RentedWSResult',另一个用于'GetCompaniesRentedWSResult',在第一个映射文件中映射父类('success'和'errors')的字段在第二个唯一的孩子的领域('租用公司')。你认为这可能吗? – user309949 2011-12-29 09:32:14

+0

是的,只需使用标签即可。我会修改上面的绑定文件 – Brian 2011-12-29 15:08:07

+0

谢谢Brian,在我的初始文章中进行了修改,但仍然无法正常工作。别担心,我只是试图将它映射到同一个文件中。非常感谢。 – user309949 2011-12-29 17:21:46

0

只有解决方案我发现这个问题是所有的映射都包含在一个文件中,就像你所做的那样。这很不方便,但我认为它很好。我在网上其他地方读过这个问题,Castor根据哪个类加载器在使用中可能会遇到这个问题。它会查找包含在类加载器的bin文件夹中的映射,这显然不是正确的地方。 (在我的情况的WebSphere)

可能能够把一个绝对路径,即

<include href="file:////C://mapping.xml" /> 

,但我一直无法验证,如果这个工程最终会不会很便携或因为它是特定于部署环境的便捷解决方案。