JAXB избегание циклических ссылок с использованием @XmlIDREF - PullRequest
1 голос
/ 17 июля 2010

Я использую JAXB в веб-сервисе с некоторыми немного сложными объектами.Один из объектов, Sensor, имеет список других объектов, с которыми он может взаимодействовать, которые обязательно могут включать себя (поведение, которое нельзя изменить), приводя к циклической ссылке во время маршалинга на 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.

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

Приветствия,

Крис

1 Ответ

1 голос
/ 20 июля 2010

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

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

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

}

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

...