2013-01-11 4 views
1

У меня есть существующая сложная объектная модель, которую я пытаюсь настроить на JAXB xml. Я не хочу менять какие-либо существующие классы домена, если это возможно. У меня есть этот фрагмент кода работает Маршаллу в файл (с помощью Groovy)Можно ли анализировать анализы объектов JAXB?

def marshallToFile(Object objectToMarshall, File location){ 

    def context = JAXBContext.newInstance(objectToMarshall.class) 

    def m = context.createMarshaller() 
    m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true) 

    location.withOutputStream { out -> 
     m.marshal(new JAXBElement(new QName("","rootTag"),objectToMarshall.class,objectToMarshall), out) 
    } 

} 

Проблема заключается в том, что объект Graph является очень сложным и JAXB говорит мне com.sun.istack.internal.SAXException2: A cycle is detected in the object graph. This will cause infinitely deep XML: [email protected][Id=100053900] -> [email protected][Id=100053900]

Есть ли способ, чтобы получить более подробную информацию о обнаруженный цикл? Кто-нибудь знает инструмент, который поможет проанализировать график или перечислить его графически, чтобы я мог выбирать циклы? У меня такое чувство, что на этом графике много циклов (это старое и сложное), поэтому любая помощь будет оценена.

Возможно, в качестве альтернативы вы можете сказать JAXB, что только уровни «n» находятся глубоко или что-то похожее, так что он не создает бесконечно глубокий XML?

Edit:

Так по отношению к моей конкретной проблеме ... Оказывается, существующий объект домена был Object getThis() и void setThis(Object obj) метод определил, что было «получением» и «установка» this самореференции ключевых слов , Именно это и вызывало мой цикл. Это также подчеркивает тот факт, что JAXB должен использовать определения метода JavaBean для определения того, какие свойства он будет маршаллировать (о чем я раньше не знал).

Однако, я думаю, что исходный вопрос все еще стоит, есть ли хорошие инструменты для анализа/просмотра графа объекта?

ответ

0

Возможно, ваш объект реализует интерфейс CycleRecoverable, чтобы найти информацию о цикле.

import java.util.*; 
import javax.xml.bind.annotation.*; 
import com.sun.xml.bind.CycleRecoverable; 

@XmlRootElement 
public class Department implements CycleRecoverable { 

    @XmlAttribute 
    public int id; 
    public String name; 
    public List<Employee> employees = new ArrayList<Employee>(); 

    public Object onCycleDetected(Context arg0) { 
     // Context provides access to the Marshaller being used: 
     System.out.println("JAXB Marshaller is: " + cycleRecoveryContext.getMarshaller()); 

     DepartmentPointer p = new DepartmentPointer(); 
     p.id = this.id; 
     return p; 
    } 

} 

Для получения более подробной информации

2

Может быть, вы могли бы ввести Marshaller.Listener проследить через процесс сортировочных и свалка информации объекта, для целей диагностики. См. "Marshal Event Callbacks" (ссылки на разделы «Внешние слушатели») для получения дополнительной информации. Это не требует изменений в существующих доменах.