2009-03-18 3 views
10

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

Пример:

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

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

} 

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

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

ответ

6

Согласно этому сообщению StackOverflow: How can I ignore a superclass?

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

Update2: Я нашел a thread on java.net для подобной задачи. Эта нить привела к enhancement request, , которая была отмечена как дубликат another issue, в результате чего была добавлена ​​аннотация @XmlTransient. Комментарии в этих отчетах об ошибках приводят меня к считают, что это невозможно в актуальной спецификации .

+0

Можете ли вы предоставить ссылку на этот поток на java.net? – Matt

+0

Добавлены ссылки из цитированной части указанной проблемы SO. – benvolioT

5

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

@XmlAccessorType(XmlAccessType.NONE) 

перед КАЖДОЙ суперкласса декларации (и сам класс).

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

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

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

Интерфейсы, конечно, не нужны никакие аннотации JAXB.

+0

Я не хотел идти в суперклассы, но я также пришел к такому выводу. Спасибо за ответ. – Matt

1

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

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

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

+1

Вы нашли что-нибудь по этому поводу? – Matt

+0

Отмените свойство и добавьте к нему аннотацию '@ XMLTransient'. – HDave

3

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

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

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

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

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

0

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

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