2011-11-24 2 views
1

JAXB에서 자체 참조하는 클래스를 사용하여 다운 캐스트에 문제가 있습니다.JAXB 자체 참조 객체 및 다운 캐스팅 관련 문제

내 설치가 :

@XmlRootElement 
class IdentifiableObject { 
    @XmlID 
    @XmlAttribute 
    String id; 

    @XmlAttribute 
    String name; 
} 

@XmlRootElement 
class Node extends IdentifiableObject { 
    @XmlElement 
    @XmlJavaAdapter(SimpleAdapterThatJustDowncastsToIdentifiableObject.class) 
    Node parent; 

    @XmlElement 
    String aField; 
} 

나는 다른 개체 듬뿍 이런 짓을했는지, 그리고 그것을 잘 작동합니다. 그러나 자신을 참조하는 클래스를 사용할 때 작동하지 않습니다.

해결할 수있는 방법이 있습니까? 내가 XmlID/XmlIDREF 좀 문제를 해결하여 알아,하지만 난 정말

명확히하기 위해 (나는 식별에서 ID 이름을 원하는) 단순한 심판보다 더 원하는, 이것은 내가 무엇을 얻을 수 있습니다 :

<nodes> 
    <node id="49ad1cb6-f6fe-47f9-a544-4a1c6337c4a5" name="Node 1"> 
     <aField>This is Node 1</aField> 
    </node> 
    <node id="0a1d1895-49e1-4079-abc1-749c304cc5a2" name="Node 2"> 
     <parent xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="node" id="49ad1cb6-f6fe-47f9-a544-4a1c6337c4a5" name="Node 1"> 
      <aField>This is Node 1</aField> 
     </parent> 
     <aField>This is Node 2</aField> 
    </node> 
</nodes> 

<nodes> 
    <node id="49ad1cb6-f6fe-47f9-a544-4a1c6337c4a5" name="Node 1"> 
     <aField>This is Node 1</aField> 
    </node> 
    <node id="0a1d1895-49e1-4079-abc1-749c304cc5a2" name="Node 2"> 
     <parent id="49ad1cb6-f6fe-47f9-a544-4a1c6337c4a5" name="Node 1"/> 
     <aField>This is Node 2</aField> 
    </node> 
</nodes> 

UPDATE를 : : 그냥 메모를 여기에서는 schemagen 실제로 올바른 일을

는 그리고이 제가 원하는 것입니다. JAXB RI의 버그 일 수 있습니다.

감사합니다, 모르 텐

답변

1

당신은 당신의 사용 사례에 대한 XmlAdapter 필요하지 않습니다. 당신은 @XmlTransientIdentifiableObject 클래스 표시하여 문제를 해결할 수 있습니다 :

노드

package forum8257098; 

import java.util.List; 

import javax.xml.bind.annotation.*; 

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Nodes { 

    @XmlElement(name="node") 
    private List<Node> nodes; 

} 

노드를

package forum8257098; 

import javax.xml.bind.annotation.*; 

@XmlRootElement 
public class Node extends IdentifiableObject { 

    @XmlElement 
    private Node parent; 

    @XmlElement 
    private String aField; 

} 

IdentifiableObject

package forum8257098; 

import javax.xml.bind.annotation.*; 

@XmlTransient 
public class IdentifiableObject { 

    @XmlID 
    @XmlAttribute 
    private String id; 

    @XmlAttribute 
    private String name; 

} 
추가 정보 7백45경1천5백15조5백36억9천1백36만3천2백10

데모

package forum8257098; 

import java.io.File; 

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.Marshaller; 
import javax.xml.bind.Unmarshaller; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(Nodes.class); 

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     File xml = new File("src/forum8257098/input.xml"); 
     Nodes nodes = (Nodes) unmarshaller.unmarshal(xml); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(nodes, System.out); 
    } 

} 

입력/출력

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<nodes> 
    <node name="Node 1" id="49ad1cb6-f6fe-47f9-a544-4a1c6337c4a5"> 
     <aField>This is Node 1</aField> 
    </node> 
    <node name="Node 2" id="0a1d1895-49e1-4079-abc1-749c304cc5a2"> 
     <parent name="Node 1" id="49ad1cb6-f6fe-47f9-a544-4a1c6337c4a5"/> 
     <aField>This is Node 2</aField> 
    </node> 
</nodes>