У меня есть 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;
}
Я был бы очень признателен за вашу помощь, я не знаю, как заставить ее работать. Спасибо