2012-12-13 29 views
2

我有一個UUID類,我從靜態工廠方法(如 )獲取uuid UUIDGenerator.getInstance()。getUuid();當使用工廠方法檢索到一個值時,從JAXB創建xml

我有另一個有這些UUids作爲列表的類。

class Artifact 
    { 
     Uuid uuid; 
     setUuid(Uuid uuid) 
     { 
     this.uuid = uuid; 
     } 

     Uuid getUuid() 
     { 
     return this.uuid; 
     } 
    } 


Class ArtifactData 
{ 
    private List<Artifact> artifacts; 
    //setter for list 
    // getter for list 

} 

我想XML以創建爲

<ArtifactData> 
<AssociatedArtifactList> 
<ArtifactUuid>#some value<ArtifactUuid> 
</AssociatedArtifactList> 
</ArtifactData> 

如何創建這個XML列JAXB註釋。它抱怨說沒有Uuid的公共構造函數,因爲它是用工廠方法構建的。

編輯:Uuid和Uuid發生器不能被修改。他們在JAR中。這是我到目前爲止所嘗試的

public class Artifact 
{ 
    @XmlJavaTypeAdapter(ArtifactUuidAdapter.class) 
    private Uuid uuid; 


    public Uuid getUuid() 
    { 
     return uuid; 
    } 

    public void setUuid(Uuid uuid) 
    { 
     this.uuid = uuid; 
    } 

} 

@XmlRootElement 
public class ArtifactData 
{ 
    private List<Artifact> associatedArtifactList; 
    public List<Artifact> getArtifacts() 
    { 
     return associatedArtifactList; 
    } 

    @XmlElementWrapper(name="associatedArtifactList") 
    @XmlElement(name = "artifactUuid") 
    public void setArtifacts(List<Artifact> artifacts) 
    { 
     this.associatedArtifactList = artifacts; 
    } 
} 


public class ArtifactUuidAdapter extends XmlAdapter<Uuid, String> 
{ 
    @Override 
    public Uuid marshal(String uuid) throws Exception 
    { 
     return Uuid.getInstance(uuid); 
    } 

    @Override 
    public String unmarshal(Uuid uuid) throws Exception 
    { 
     return uuid.getData(); 
    } 
} 

我仍然收到一個錯誤,稱爲no arg默認構造函數丟失。

+0

也許使用@XmlJavaTypeAdapter註釋http://jaxb.java.net/nonav/2.2.6/docs/api/javax /xml/bind/annotation/adapters/XmlJavaTypeAdapter.html將其轉換爲不同的類型,例如字符串,可以工作(我自己從未嘗試過)。 – Eelke

+0

如果您在列表中有兩個「Artifact」實例,那麼您的XML將如何? –

+0

這將是2 ArtifactUuid元素 – Phoenix

回答

0

@XmlType註釋允許您配置工廠類和方法。您的問題中描述的工廠類不完全符合API要求,但您可以輕鬆地爲其創建適配器。

UUIDGeneratorAdapter

下面的類會適應你的工廠類的東西,一個JAXB(JSR-222)實現可以利用。

public class UUIDGeneratorAdapter { 

    public static Uuid getUuid() { 
     return UUIDGenerator.getInstance().getUuid(); 
    } 

} 

UUID

下面是你如何通過@XmlType註釋配置工廠類的實例。

import javax.xml.bind.annotation.XmlType; 

@XmlType(factoryClass=UUIDGeneratorWrapper.class, factoryMethod="getUuid") 
public class Uuid { 

    // ... 

} 

更多信息

+0

我無法訪問Uuid ..它被打包成一個jar ..我只能訪問ArtifactData – Phoenix

相關問題