Проблема в том, что контракты веб-сервисов (по крайней мере, те, которые соответствуют WS-I Basic Profile) не могут кодировать ссылки на другие объекты в сообщении. Таким образом, поле ссылочного типа всегда маршалируется путем маршалинга полей объекта, к которому он относится. Эта рекурсия безгранична, если граф объектов содержит цикл.
То есть, если у вас было:
class A {
String name;
A a;
}
и сделал:
A a = new A();
a.name = "hello";
a.a = a;
marshall(a);
XML будет выглядеть как
<a>
<name>hello</name>
<a>
<name>hello</name>
<a>
<name>hello</name>
<a>
...
Чтобы избежать этого, цикл необходимо разорвать. Типичные подходы включают в себя сделать ассоциацию доступной только в одном направлении, установить обратные ссылки на null
перед маршалингом (поручить получателю восстановить их), переместить ассоциации в отдельные классы, как в
class A {
String name;
}
class B {
String adress;
}
class AWithB {
A a;
B b;
}
и множество других опций.