2012-05-22 33 views
0

我有一個使用Jersey的Java Webservice。 現在我想發送地圖(行和列)到客戶端的地圖。Java Webservice - Jersey XmlAdapter用於映射地圖

一切正常,當我離開它,因爲它是。但隨後XMLOutput看起來像這樣...

data> 
    <entry> 
     <key>0</key> 
     <value> 
      <data> 
       <entry> 
        <key>id</key> 
        <value>20</value> 
       </entry> 
       <entry> 
        <key>status</key> 
        <value>test</value> 
       </entry> 
       <entry> 
        <key>number</key> 
        <value>20</value> 
       </entry> 
       <entry> 
        <key>cars</key> 
        <value>3</value> 
       </entry> 

      </data> 
     </value> 
    </entry> 
</data> 

不過,我想有這樣的事情...

<data> 
    <entry row=0> 
     <column name=id>20</column> 
     <column name=status>OK</column> 
     <column name=number>1</column> 
     <column name=cars>1</column> 
    </entry> 
    <entry row=1> 
     <column name=id>21</column> 
     <column name=status>OK</column> 
     <column name=number>1</column> 
     <column name=cars>2</column> 
    </entry> 
    <entry row=2> 
     <column name=id>22</column> 
     <column name=status>OK</column> 
     <column name=number>1</column> 
     <column name=cars>3</column> 
    </entry> 
</data> 

爲了控制XML輸出我想使用XmlAdapters但我不」讓它工作。

類,它包含的行:

public class CoDataMap { 

    public LinkedHashMap<String, String> data = new LinkedHashMap<String, String>(); 

} 

我怎麼會寫XmlAdapter和類型正確編組的對象:包含列

public class CoDataList{ 

    public LinkedHashMap<Integer, CoDataMap> data = new LinkedHashMap<Integer,CoDataMap>(); 

} 

類?

我做了這樣的事......但我在哪裏添加下一個XmlAdapter?

MainClass包含的行和列

@XmlRootElement 
public class Response implements Cloneable{ 

    @XmlJavaTypeAdapter(CoDataListAdapter.class) 
    public CoDataList data = new CoDataList(); 

} 

現在我寫的CoDataList和CoDataMap適配器:

public class CoDataListAdapter extends XmlAdapter<CoDataListType, CoDataList>{ 

@Override 
public CoDataListType marshal(CoDataList v) throws Exception { 
    CoDataListType rows = new CoDataListType(); 
      for (int currentRow : v.data.keySet()){ 
     CoDataListEntryType row= new CoDataListEntryType(); 
      row.key = currentRow; 
     row.map = v.data.get(currentRow); 
     rows.entry.add(row); 
    } 
    return rows; 
} 

@Override 
public CoDataList unmarshal(CoDataListType v) throws Exception { 
    // TODO Auto-generated method stub 
    return null; 
} 

} 

public class CoDataMapAdapter extends XmlAdapter<CoDataMapType, CoDataMap> { 

@Override 
public CoDataMapType marshal(CoDataMap v) throws Exception { 
    CoDataMapType columns = new CoDataMapType(); 
    for (String curCol : v.data.keySet()){ 
        CoDataMapEntryType column= new CoDataMapEntryType(); 
     column.key = curCol; 
     column.value = v.data.get(curCol); 
     columns.entry.add(column); 
    } 
    // TODO Auto-generated method stub 
    return columns; 
} 

@Override 
public CoDataMap unmarshal(CoDataMapType v) throws Exception { 
    //... 
} 
} 

public class CoDataListType { 
    public List<CoDataListEntryType> entry = new ArrayList<CoDataListEntryType>(); 
} 

public class CoDataListEntryType { 

@XmlAttribute(name="row") 
    public Integer key; 

    @XmlValue 
    @XmlJavaTypeAdapter(CoDataMapAdapter.class) 
    public CoDataMap map; 
} 

在這一點上我得到一個異常:

@ XmlAttribute/@ XmlValue需要引用映射在XML.xmladapter


文本Java類型
public class CoDataMapType { 
    public List<CoDataMapEntryType> entry = new ArrayList<CoDataMapEntryType>(); 
} 

public class CoDataMapEntryType { 
    @XmlAttribute(name="column") 
    public String key; 

    @XmlValue 
    public String value; 
} 

我真的很感謝你的幫助,我不知道如何讓它工作。謝謝

回答

0

我已經摸索了這一點:

下列類需要改變:

public class CoDataListAdapter extends XmlAdapter<CoDataListType, CoDataList<CoDataMap<String, String>>>{ 

@Override 
public CoDataListType marshal(CoDataList<CoDataMap<String, String>> v) throws Exception { 


    CoDataListType rows = new CoDataListType(); 

    for (int currentRow : v.keySet()){ 

     CoDataListEntryType row= new CoDataListEntryType(); 

     row.key = currentRow; 

     for (String key : v.get(currentRow).keySet()){ 
      CoDataMapEntryType column = new CoDataMapEntryType(); 

      column.name = key; 
      column.value = v.get(currentRow).get(key); 

      row.column.add(column); 
     } 


     rows.row.add(row); 


    } 


    return rows; 
} 

@Override 
public CoDataList<CoDataMap<String, String>> unmarshal(CoDataListType v) throws Exception { 


    CoDataList<CoDataMap<String,String>> rows = new CoDataList<CoDataMap<String,String>>(); 

    for (CoDataListEntryType row : v.row){ 


     CoDataMap<String, String> columns = new CoDataMap<String, String>(); 
     for (CoDataMapEntryType column : row.column){ 
      columns.put(column.name, column.value); 
     } 
     rows.put(row.key, columns); 

    } 




    // TODO Auto-generated method stub 
    return rows; 
} 

} 

public class CoDataListEntryType { 

@XmlAttribute(name="id") 
public Integer key; 

@XmlElement 
public List<CoDataMapEntryType> column = new ArrayList<CoDataMapEntryType>(); 
} 

現在我需要有隻有一個適配器。 類CoDataMapAdapter和CoDataMapType是不必要的。