【问题标题】:Castor: How to map a Java hierarchyCastor:如何映射 Java 层次结构
【发布时间】:2011-12-28 15:46:46
【问题描述】:

我在映射层次结构时遇到了这个 Java-Castor 问题。感谢您的宝贵时间。

我有这个 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;
}

还有这些 Castor 映射:

<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

【问题讨论】:

  • 忘了提到为一个类 (GetCompaniesRentedWSResult) 映射所有字段效果很好。这只是映射层次结构中缺少的东西。

标签: java mapping hierarchy extends castor


【解决方案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>

【讨论】:

  • 感谢您的回答,布赖恩。不错的方法。问题是我想在两个单独的映射文件中执行此操作,一个用于“RentedWSResult”,另一个用于“GetCompaniesRentedWSResult”,在第一个映射中映射父类的字段(“成功”和“错误”)和在第二个中唯一的孩子的领域('rentedCompanies')。你认为这可能吗?
  • 是的,只需使用 标签。我会修改上面的绑定文件
  • 谢谢布赖恩,在我最初的帖子中进行了修改,但仍然无法正常工作。别担心,我会尝试将它映射到同一个文件中。非常感谢。
【解决方案2】:

我发现此问题的唯一解决方案是像您所做的那样将所有映射包含在一个文件中。这很不方便,但我认为它和它一样好。我在网上其他地方读到,这是 Castor 可能遇到的问题,具体取决于正在使用的类加载器。它将在类加载器的 bin 文件夹中查找包含的映射,这显然不是正确的位置。 (在我的例子中是 websphere)

可能可以设置绝对路径,即

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

但我无法验证这是否可行,并且最终不会是非常便携或方便的解决方案,因为它特定于部署环境。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多