2013-08-12 1 views
0

Good DayПолиморфизм Castor Hashtable

Я пытаюсь использовать кастор для построения HashTable, который имеет несколько реализаций абстрактного класса. здесь является родительским «конфигурации»

<class name="com.Config"> 
    <map-to xml="config" /> 
    <field name="rulesMap" collection="hashtable"> 
     <bind-xml auto-naming="deriveByClass" > 
      <class name="org.exolab.castor.mapping.MapItem"> 
       <field name="key" type="java.lang.String"> 
        <bind-xml name="name" node="attribute" /> 
       </field> 
       <field name="value" type=com.Rule"> 

       </field> 
      </class> 
     </bind-xml> 
    </field> 
</class> 

«com.Rule» является абстрактным классом и в конце дня я хотел бы XML-структуру, которая выглядит, как этот

<config> 
<rule-impl1 name="ruleType1Instance1" ruleField="field" /> 
    <rule-impl2 name="ruleType2Instance2" ruleField="field" ruleImpl2Field1="..." /> 
</config> 

ответ

0

I «Не уверен, что есть достаточно деталей или вопроса, который здесь хорошо сформирован, чтобы дать точный ответ, но я делал что-то довольно похожее и сталкивался с некоторыми препятствиями. Думал, что я предоставил бы свои 2 цента. Я не так хорошо знаком с Кастором, как и с некоторыми другими XML-фреймворками, и в моем случае Кастор делает автоматическую сортировку/развязку вместо того, чтобы мы вручную записывали код, чтобы решить, когда мы хотим, чтобы это было сделано. Если бы мы вручную делали эту пьесу, я думал, что мы смогли бы принять решение об отказе от участия в определенных классах, расширяющих абстрактный класс.

Со всем моим отказом от ответственности, что вы могли бы сделать.

** Если вы можете добавить поле запроса/ответа, то создать что-то вроде этого:

public class RuleContainer { 
private RuleType ruleType; // possibly build enum or other non-java equivalent 
private RuleImpl1 ruleImpl1; 
private RuleImpl2 ruleImpl2; 
private RuleImpl...N ruleImpl...N; 
// getters & setters, etc 
} 

Тогда значение вашей таблицы изменяется на

<field name="value" type="com.RuleContainer"></field> 

и включают в себя отображение от RuleContainer

<class name="com.RuleContainer"> 
    <field name="ruleType" type="com.RuleType" 
    <field name="ruleImpl1" type="com.RuleImpl1"> 
    <field name="ruleImpl2" type="com.RuleImpl2"> 
    <field name="ruleImpl...N" type="com.RuleImpl...N"> 
</class> 

также включают в себя отображения каждой реализации независимо от того, что может выглядеть l Айк. В моем случае я разбил каждое картирование реализации в отдельный файл и использовать

<include href="" /> 

тег, чтобы включить эти лишние отображения в родительском файле.

Все это позволяет вам использовать это поле RuleType, чтобы узнать, какое правило в RuleContainer является допустимым (остальное будет равно null, если требуется значение Castor = «false»). Логика для работы с каждой реализацией правила проста писать оттуда. Надеюсь, это поможет.

Смежные вопросы