2012-05-22 3 views
0

У меня есть 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, но я не» t заставить его работать.

Класс, который содержит строки:

public class CoDataList{ 

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

} 

класса, который содержит столбцы:

public class CoDataMap { 

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

} 

Как я пишу XMLAdapter и тип маршал объектов правильно?

Я сделал что-то вроде этого ... но где бы я добавил следующий 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 нужно ссылаться на тип Java, который отображает текст, в XML.xmladapter


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 не нужны.