Как я могу предотвратить привязку JAXB методов суперкласса @XmlRootElement при сортировке? - PullRequest
10 голосов
/ 18 марта 2009

У меня есть класс, который помечен как @XmlRootElement с @XmlAccessorType(XmlAccessType.NONE). Проблема, с которой я сталкиваюсь, заключается в том, что методы суперкласса связаны, когда я не хочу, чтобы они были связаны, и не могу обновить класс. Я надеюсь, что есть аннотация, которую я могу добавить к классу корневых элементов, чтобы предотвратить это.

Пример:

@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
public class Person extends NamedObject {

    @XmlElement
    public String getId() { ... }

}

Я ожидаю, что только методы, аннотированные @XmlElement на Person, будут связаны и маршалированы, но все методы суперкласса также связаны. Полученный XML-файл содержит слишком много информации.

Как предотвратить привязку методов суперкласса без необходимости аннотировать сам суперкласс?

Ответы [ 5 ]

6 голосов
/ 18 июня 2010

Согласно этому сообщению StackOverflow: Как я могу игнорировать суперкласс?

С JAX-B невозможно игнорировать суперкласс без изменения суперкласса. Цитирую соответствующую часть этого поста:

Обновление2: я нашел ветку на java.net для аналогичной проблемы. Что нить в результате запрос на улучшение , который был отмечен как дубликат другая проблема , в результате которой @XmlTransient аннотация. Комментарии на этих сообщениях об ошибках приводят меня к считаю, что это невозможно в текущая спецификация

5 голосов
/ 22 марта 2009

Просто добавьте

@XmlAccessorType(XmlAccessType.NONE)

перед КАЖДЫМ объявлением суперкласса (и самим классом).

В вашем случае:

@XmlAccessorType(XmlAccessType.NONE)
class NamedObject{
    [ ... ]
}

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

Интерфейсам, разумеется, не нужны аннотации JAXB.

3 голосов
/ 19 января 2011

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

Создайте package-info.java в вашем пакете и вставьте

@XmlAccessorType(XmlAccessType.NONE)
package my.package.with.classes;

Очевидно, он устанавливает XmlAccessType.NONE для всех классов в пакете. Я использую его в каждом пакете в нашей модели предметной области. Поэтому я в безопасности. Однако, если ваш класс «вне досягаемости», например это в JDK, используйте решение из принятого ответа в [JAX-B] Как я могу игнорировать суперкласс? .

Надеюсь, это поможет любому, кто наткнется на этот вопрос, как я.

1 голос
/ 02 апреля 2009

Я столкнулся с точно такой же проблемой. Мой суперкласс не обрабатывает аннотации JAXB (это не обязательно), и я бы хотел, чтобы мой подкласс не включал свойства суперкласса при маршалинге.

Добавление XmlAccesorType в суперкласс не может быть решением, так как у меня нет способа изменить суперкласс.

Есть ли другое решение?

0 голосов
/ 27 января 2012

Замените вашу реализацию JAX-B на MOXy , и вы сможете делать все, что захотите. Он имеет множество расширений, выходящих за рамки обычного JAX-B, одно из которых позволит вам игнорировать унаследованные свойства и т. Д. Он также поддерживает перемещение аннотаций JAX-B в файл сопоставления XML, что позволяет хранить несколько наборов сопоставлений .

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