약간 복잡한 객체가있는 웹 서비스에서 JAXB를 사용하고 있습니다. 객체 중 하나 인 Sensor에는 통신 할 수있는 다른 객체의 목록이 있으며, 반드시 포함될 수있는 객체 (변경할 수없는 동작)가 XML에 마샬링되는 동안 순환 참조로 이어집니다.@XmlIDREF를 사용하는 JAXB 순환 참조 회피
@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로 마샬링하고 서버는 객체를 완벽하게 비 정렬화할 수 있습니다.
내가 겪고있는 문제는 서버 측에서 어떤 이유로 센서 객체를 마샬링하려고 할 때 순환 참조 예외가 발생한다는 것입니다. madening 부분은 서버 측 코드에 wsimport가 클라이언트 측 코드를 작성하는 데 사용하는 JAXB 어노테이션을 포함하고 있다는 점입니다. 그러나이 코드는 순환으로 인해 서버 측 센서를 마샬링 할 수 없습니다.
JAXB가 @XmlIDREF 주석을 제대로 적용하지 못하게하는 JAXB의 런타임 버그가있을 것이라고 생각한 JAXB가 클라이언트 측 코드에 추가 한 모든 클라이언트 측 코드를 서버 측 클래스에 추가하려고했습니다. 운이 없다.
아마 내가 여기에 실종되었다는 것이 있지만이 문제는 나에게 조금은 힘들게 만들고 나는 그것을 알아내는 동안 막 다른 길에 서있다.
내가 조사한 한 가지 사실은 생성 된 클라이언트 측 객체의 일부 네임 스페이스가 예상대로 작동하지 않지만 코드가 작동한다는 것입니다. 서버의 네임 스페이스 문제로 인해 IDREF 마샬링이 폭탄을 일으키는 지 궁금합니다.
수정 사항이나 추가 문제 해결에 대한 제안 사항을 보내 주시면 대단히 감사하겠습니다.
건배
Blaise, 저는 그렇게 생각하지 않습니다. @XmlAccessorType (.. FIELD)은 SensorCommLink 클래스에 있습니다. 원래 주석에서 추가 주석을 남겼습니다. 아마 나는 그것을 명확하게하기 위해 편집 할 것이다. 그래도 고마워. –