2010-07-17 4 views
1

약간 복잡한 객체가있는 웹 서비스에서 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 마샬링이 폭탄을 일으키는 지 궁금합니다.

수정 사항이나 추가 문제 해결에 대한 제안 사항을 보내 주시면 대단히 감사하겠습니다.

건배

답변

1

크리스 서버 측에서 임의의 확률로 그 특성 (/ 세트를 취득) 대신 필드 (인스턴스 변수)를 처리한다. 당신은 다음과 같은 방법으로 필드 액세스 적용 할 수 있습니다 :

@XmlAccessorType (XmlAccessType.FIELD) 공용 클래스 SensorCommLink {

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

}

을 아니면 get 메소드에 주석을 달 수 있습니다.

+0

Blaise, 저는 그렇게 생각하지 않습니다. @XmlAccessorType (.. FIELD)은 SensorCommLink 클래스에 있습니다. 원래 주석에서 추가 주석을 남겼습니다. 아마 나는 그것을 명확하게하기 위해 편집 할 것이다. 그래도 고마워. –