Я строй REST API с помощью Jersey
где XML and JSON
выходов разрешены в зависимости от того, какого формата клиент предпочитает (с использованием Accept
заголовка) .Отель службы отправляет ниже класс как выход, который выглядит как этотДжерси обслуживание остальные не возвращается XMLresponse
@XmlRootElement
public class ProjectDetails{
private List<Attachment> attachments;
private Map<String, List<Attachment>> imageCategory;
@XmlTransient
public List<Attachment> getAttachments() {
return attachments;
}
public void setAttachments(List<Attachment> attachments) {
this.attachments = attachments;
}
public Map<String, List<Attachment>> getImageCategory() {
if(attachments == null || attachments.size() == 0){
return null;
}
Map<String, List<Attachment>> map = new HashMap<String, List<Attachment>>();
for (Attachment img : attachments){
String key = img.getCategory();
if(BaseUtil.hasText(key)){
List<Attachment> values = map.get(key);
if (values == null){
values = new ArrayList<Attachment>();
}
values.add(img);
map.put(key, values);
}
}
this.imageCategory = map ;
return imageCategory;
}
public void setImageCategory(Map<String, List<Attachment>> imageCategory) {
this.imageCategory = imageCategory;
}
}
Я не хочу, чтобы attachments field
в качестве вывода так помечал его @XmlTransient
. Я хочу сформировать Map
с помощью поля вложений и отправить его в виде вывода.
В случае JSON
формат, я получаю правильный ответ. Но в случае XML
, я не получаю никакого вывода, когда я попал в службу.
Я думаю, что это связано с этим полем Карты, потому что если я удалю поле Карты и добавлю другое поле, например String, тогда я получу это поле в ответ.
Пожалуйста, дайте мне знать, как решить эту проблему.
Update: Через некоторое Googling, я нашел XmlAdapter
решение и реализовано, как показано ниже
public class MapAdapter extends
XmlAdapter<MapAdapter.AdaptedMap, Map<String, List<Attachment>>> {
public static class AdaptedEntry {
public String key;
public List<Attachment> value = new ArrayList<Attachment>();
}
public static class AdaptedMap {
List<AdaptedEntry> entries = new ArrayList<AdaptedEntry>();
}
@Override
public AdaptedMap marshal(Map<String, List<Attachment>> map)
throws Exception {
AdaptedMap adaptedMap = new AdaptedMap();
for (Entry<String, List<Attachment>> entry : map.entrySet()) {
AdaptedEntry adaptedEntry = new AdaptedEntry();
adaptedEntry.key = entry.getKey();
adaptedEntry.value = entry.getValue();
adaptedMap.entries.add(adaptedEntry);
}
return adaptedMap;
}
@Override
public Map<String, List<Attachment>> unmarshal(AdaptedMap adaptedMap)
throws Exception {
List<AdaptedEntry> adapatedEntries = adaptedMap.entries;
Map<String, List<Attachment>> map = new HashMap<String, List<Attachment>>(
adapatedEntries.size());
for (AdaptedEntry adaptedEntry : adapatedEntries) {
map.put(adaptedEntry.key, adaptedEntry.value);
}
return map;
}
А потом
@XmlJavaTypeAdapter(MapAdapter.class)
public Map<String, String> getImageCategory() {
Но все-таки это не working..Anything я пропустил?
Возможное решение: [Как убедить ert XML в java.util.Map и наоборот] (https://stackoverflow.com/questions/1537207/how-to-convert-xml-to-java-util-map-and-vice-versa) –