Избегание циклических ссылок JAXB с использованием @XmlIDREF

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

@XmlAccessorType(XmlAccessType.FIELD)
public class Sensor extends BaseObject {

    private ArrayList<SensorCommLink> sensorCommLinks;

}

@XmlAccessorType(XmlAccessType.FIELD)
public class SensorCommLink {

    @XmlIDREF
    private BaseObject receiver;
    @XmlIDREF
    private Sensor cueingSensor;

}

@XmlAccessorType(XmlAccessType.FIELD)
public abstract class BaseObject {

    @XmlElement 
    @XmlID
    private String id;

}

Как показано выше, я решил эту проблему, используя @XmlIDREF и @XmlID, и это работает очень хорошо.

Код на стороне клиента, сгенерированный с помощью wsimport, упорядочивает объекты в XML, и сервер может их идеально разобрать.

Проблема, с которой я сталкиваюсь, заключается в том, что по какой-то причине на стороне сервера я получаю исключение циклической ссылки, когда пытаюсь маршалировать объект Sensor. Бесит то, что код на стороне сервера содержит аннотации JAXB, которые используются wsimport для создания кода на стороне клиента, который прекрасно работает, но я не могу маршалировать датчики на стороне сервера из-за цикла.

Я попытался скопировать все дополнительные аннотации, которые JAXB добавляет к коду на стороне клиента, в классы на стороне сервера, думая, что, возможно, в JAXB была ошибка времени выполнения, которая мешала правильному применению аннотации @XmlIDREF. Не повезло там.

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

Я заметил одну вещь, которую исследую: некоторые пространства имен в сгенерированных клиентских объектах не соответствуют моим ожиданиям, хотя код работает. Мне любопытно посмотреть, не вызывает ли каким-то образом проблема с пространством имен на сервере сортировки IDREF.

Любые предложения по исправлению или дополнительному устранению неполадок будут высоко оценены!

Ваше здоровье,

Крис


person Chris M    schedule 17.07.2010    source источник


Ответы (1)


Любой шанс на стороне сервера обрабатывает свойства (get/set) вместо полей (переменные экземпляра). Вы можете обеспечить доступ к полям следующим образом:

@XmlAccessorType(XmlAccessType.FIELD) открытый класс SensorCommLink {

@XmlIDREF 
private BaseObject receiver; 
@XmlIDREF 
private Sensor cueingSensor; 

}

Или вы можете аннотировать методы get.

person bdoughan    schedule 20.07.2010
comment
Блейз, я так не думаю. @XmlAccessorType(..FIELD) находится в классе SensorCommLink — я просто исключил эти дополнительные аннотации из своего исходного сообщения. Возможно, я отредактирую его для ясности. Спасибо хоть. - person Chris M; 21.07.2010