2011-03-12 95 views
2
元素之間的引用

有一個問題,我也有類似的階級結構:如何處理JAXB

class A { 
public String a; 
} 

class B extends A { 
public String b; 
} 

class C { 
    public List<A> alist; 
    public A current; 
} 

這個類的結構不能改變。即我無法添加ID屬性。 我需要爲這些類創建xsd模式。 current元素是一個來自alist元素。 所以我想在這裏提供一些參考。但我不知道如何使用@XmlID@XmlIREF。 然後基於模式XML文件將被生成並通過JAXB加載到對象。 有沒有辦法做到這一點?可能以某種方式使用xpointer或其他什麼,JAXB可以理解?

+0

是對「A」類的唯一標識符的「一」財產? –

+0

不,它不是唯一的。擁有某種xpath指針,例如從alist中取第二個元素並將其應用到當前 – Egor

+0

C是根對象嗎? –

回答

2

好的,我結束了這樣的解決方案:

使用RuntimeAnnotationReader定製IMPL,我嵌入兩點式adater到ALIST和當前元素。

public class ABeanAdapterList extends XmlAdapter<ABeanWrapper, Abean> { 

    public int i = 0; 

    private Map<Abean, String> unmarshall = new HashMap<Abean, String>(); 
    private Map<String, Abean> marshall = new HashMap<String, Abean>(); 


    @Override 
    public Abean unmarshal(ABeanWrapper v) throws Exception { 
     marshall.put(v.id, v.abean); 
     return v.abean; 
    } 

    @Override 
    public ABeanWrapper marshal(Abean v) throws Exception { 
     ABeanWrapper beanWrapper = new ABeanWrapper(); 
     beanWrapper.abean = v; 
     beanWrapper.id = String.valueOf(i++); 
     unmarshall.put(beanWrapper.abean , beanWrapper.id); 
     return beanWrapper; 
    } 

    public String getId(Abean abean) { 
     return unmarshall.get(abean); 
    } 

    public Abean getAbean(String id) { 
     return marshall.get(id); 
    } 
} 

其中ABeanWrapper包含兩個領域:ID和ABean 爲ALIST,和電流:

public class ABeanAdapterImpl extends XmlAdapter<ABeanRef, Abean> { 

     private ABeanAdapterList listAdapter; 

     public ABeanAdapterImpl(ABeanAdapterList list) { 
      listAdapter = list; 
     } 

     @Override 
     public Abean unmarshal(ABeanRef wrapper) throws Exception { 
      return listAdapter.getAbean(wrapper.refId); 
     } 

     @Override 
     public ABeanRef marshal(Abean abean) throws Exception { 
      ABeanRef ref = new ABeanRef(); 
      ref.refId = listAdapter.getId(abean); 
      return ref; 

     } 
    } 

而且ABeanRef只包含一個REF域。 調用它這樣的方式:

Marshaller marshaller = context.createMarshaller(); 
ABeanAdapterList adapterList = new ABeanAdapterList(); 
marshaller.setAdapter(adapterList); 
ABeanAdapterImpl beanAdapter = new ABeanAdapterImpl(adapterList); 
marshaller.setAdapter(beanAdapter); 
marshaller.marshal(sBean, new File("testSBean.xml")); 

月由有更好的方法,但這種方法的工作原理...