Кастор: Как отобразить иерархию Java - PullRequest
0 голосов
/ 28 декабря 2011

У меня проблема с 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

Ответы [ 2 ]

1 голос
/ 28 декабря 2011

Нет связи между вашими классами в файле отображения.

С предоставленной вами информацией я составил карту, которая работает. Предполагается, что ваш 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 голосов
/ 28 августа 2014

Единственное решение, которое я нашел для этой проблемы, состоит в том, чтобы включить все сопоставления в один файл, как вы это сделали. Это неудобно, но я думаю, что это так же хорошо, как и получается. Я читал в другом месте онлайн, что это проблема, с которой сталкивается Кастор в зависимости от того, какой загрузчик классов находится в игре. Он будет искать включенные отображения в папке bin загрузчика классов, что, очевидно, не в том месте. (websphere в моем случае)

Вы можете иметь возможность указать абсолютный путь, т.е.

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

но я не смог проверить, работает ли это, и, в конечном счете, не будет очень портативным или удобным решением, поскольку оно специфично для среды развертывания.

...