JiBX: Как мне продолжать использовать интерфейсы в моем коде? - PullRequest
3 голосов
/ 11 июня 2009

Как сохранить используемые интерфейсы в классах, с которыми я хочу использовать привязку JiBX?

Пример: У меня есть очень простая модель в Java:

public interface A {
    B getB();
    void setB(B b);
}

public interface B {
    String getData();
    void setData(String data);
}

public class AImpl implements A {
    B b;

    @Override
    public B getB() {
        return b;
    }

    @Override
    public void setB(B b) {
        this.b = b;     
    }
}

public class BImpl implements B {
    private String data;
    @Override
    public String getData() {
        return data;
    }

    @Override
    public void setData(String data) {
        this.data = data;
    }
}

И этот обязательный документ:

<binding>
<mapping name="A"
         class="com.test.AImpl">
    <structure name="B" usage="optional" get-method="getB" set-method="setB"/>
</mapping>
<mapping name="B"
         class="com.test.BImpl">
    <value name="data" set-method="setData" get-method="getData" usage="optional"/>
</mapping>
</binding>

Когда я пытаюсь запустить свой код, я получаю следующее исключение:

java.lang.ClassFormatError: Метод в классе Com / Test / B имеет незаконный модификаторы: 0x1001

Я пытался использовать 'abstract = "true"' для обоих сопоставлений, только чтобы получить это исключение:

... вызвано: org.jibx.runtime.JiBXException: невозможно получить доступ к обязательной информации для Класс com.test.A Убедитесь, что связывание был скомпилирован ...

Единственное решение, которое я нашел, - это, чтобы AImpl держал BImpl вместо B, а получатель возвращал BImpl, а установщик получал BImpl. Это очень неправильно, так как полностью нарушает интерфейс.

Как я могу решить это? У меня были проблемы с истерикой (реальная проблема гораздо сложнее, а сообщения о загадочных ошибках JiBX не помогают) - ничего не помогло.

Это разрешимо? Действительно ли JiBX настолько навязчив (в том смысле, что от меня требуется отказаться от программирования всех интерфейсов?)

Пожалуйста, не отвечайте "используйте AbstractB", так как это та же проблема, только один уровень удален.

Ответы [ 2 ]

4 голосов
/ 11 июня 2009

В отображении вы должны иметь возможность использовать атрибут «create-type», чтобы указать конкретный класс, который JiBX должен создать для свойств bean-компонентов, имеющих тип интерфейса. Я использую это много для свойств коллекции. Например, вы можете указать JiBX создать экземпляр java.util.HashSet для свойства типа java.util.Set . Но я считаю, что это работает так же хорошо для не коллекционных свойств. Ваше отображение будет выглядеть примерно так:

<mapping class="com.mypackage.AImpl" name="A">
  <structure get-method="getB" set-method="setB" create-type="com.mypackage.BImpl">
    ...
  </structure>
  ...
</mapping>

JiBX вызовет конструктор без аргументов для создания объекта B. В качестве альтернативы, вы можете использовать фабричный или пользовательский сериализатор / десериализатор, если вам нужна причудливая логика создания экземпляров. Подробнее см. на этой справочной странице .

0 голосов
/ 12 июня 2009

Другим хорошим ресурсом является binding.dtd - очевидно, его нет в дистрибутиве, но его можно скачать здесь: http://jibx.cvs.sourceforge.net/viewvc/checkout/jibx/core/docs/binding.dtd. Поместите этот файл куда-нибудь (например, c: \ binding.dtd) Затем в верхней записи связывания используйте это:

<binding xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="file://jibx/binding.dtd">

и зарегистрируйте файл: //jibx/binding.dtd, чтобы указать на сохраненный файл binding.dtd для документации и проверки.

Удивительно, что делает инерция - я знаю, что xml-файлы должны иметь схемы / dtds, я использовал их раньше и всегда говорил «без понимания схемы это было бы невозможно». Тем не менее, когда я вошел в этот проект, мне никогда не приходило в голову искать схему / dtd для этого xml - я просто принял его как данность, что у него его нет.
Урок выучен.

...