Несколько клиентов требуют разных аннотаций JAXB - PullRequest
2 голосов
/ 12 января 2012

У меня есть класс, который может использоваться несколькими клиентами (т. Е. С графическим интерфейсом, внешней системой и т. Д.).

@XmlRootElement
class A {
    String field = "Hello World";

    public String getField() {
       return field;
    }
}

Для одного клиента я не хочу, чтобы полученный XML-код включал все детали в класс, поэтому я отмечаю детали, которые хочу скрыть, с помощью XmlTransient.

@XmlRootElement
class A {
    String field = "Hello World";

    @XmlTransient
    public String getField() {
       return field;
    }
}

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

Как мне выполнить требование, когда у меня есть два клиента, которые хотят почтиодни и те же данные?Я выполнил эту работу, расширив букву А и пометив соответствующим образом для удовлетворения потребностей каждого клиента:

@XmlRootElement
class B extends A {
    @XmlTransient
    public String getField() {
       return super.getField();
    }
}

@XmlRootElement
class C extends A {
    public String getField() {
       return super.getField();
    }
}

Это работает, но кажется громоздким.Есть ли другие способы сделать это?Я понимаю, что в показанном мною примере я могу использовать XmlJavaAdapter, но в моем реальном коде данные, на которые я ссылаюсь, могут быть частью составного объекта, и XmlJavaAdapter кажется неуместным.чувство!

Ответы [ 2 ]

2 голосов
/ 12 января 2012

Примечание: Я EclipseLink JAXB (MOXy) и являюсь членом JAXB (JSR-222) экспертная группа.

Как уже упоминалось @ skaffman , вы можете использовать расширения MOXy для выполнения этого варианта использования. MOXy предлагает возможность представления метаданных сопоставления в виде XML. Это означает, что вы можете предоставить одно сопоставление в виде аннотаций, а также дополнительные сопоставления в виде XML.

Ниже приведена ссылка на пример, в котором единая объектная модель сопоставляется с результатами метеорологических служб Google и Yahoo:

Код, соответствующий этому примеру, также доступен на GitHub:

0 голосов
/ 01 июня 2012

Я полагаю, что MOXy не является бесплатным (поправьте меня, если я ошибаюсь, пожалуйста).

Мое бесплатное решение - использовать дополнительное поле "версия" в объекте JAXB для различения нескольких версий привязок.Обычно я использую enum в качестве его типа, т.е. enum Version {V1, V2, ...};

Так что для исходного примера я определяю метод getField () как

@XmlElement
public String getField() {
    if (version == Version.V1) {
        return field;
    } else if (version == Version.V2) {
        return null; // hidden
    }

}

Для клиента 1 я установлю значение версии в Version.V1, а затем маршаллизирую объект Java;то же самое для клиента 2, я изменю значение версии на Version.v2 перед сортировкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...