2015-03-02 4 views
2

Я строй 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 я пропустил?

+0

Возможное решение: [Как убедить ert XML в java.util.Map и наоборот] (https://stackoverflow.com/questions/1537207/how-to-convert-xml-to-java-util-map-and-vice-versa) –

ответ

2

Я использовал ваш класс ProjectDetails немного измененных изменений, которые я сделал, и он обеспечивает ответ как для XML, так и для JSON. Можете ли вы попробовать это?

@XmlRootElement 
public class ProjectDetails { 
private List<Attachment> attachments; 
private Map<String, ArrayList<Attachment>> imageCategory; 

@XmlTransient 
public List<Attachment> getAttachments() { 
    return attachments; 
} 

public void setAttachments(List<Attachment> attachments) { 
    this.attachments = attachments; 
} 
@XmlJavaTypeAdapter(MapAdapter.class) 
public Map<String, ArrayList<Attachment>> getImageCategory() { 
    if(attachments == null || attachments.size() == 0){ 
     return null; 
    } 
    Map<String, ArrayList<Attachment>> map = new HashMap<String, ArrayList<Attachment>>(); 
    for (Attachment img : attachments){ 
     String key = img.getCategory(); 
     if(!key.equals("")){ 
      ArrayList<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, ArrayList<Attachment>> imageCategory) { 
    this.imageCategory = imageCategory; 
} 

} 

А класс адаптера вы можете использовать следующие

public class MapAdapter extends XmlAdapter<MapElement[], Map<String, ArrayList<Attachment>>>{ 
public MapElement[] marshal(Map<String, ArrayList<Attachment>> arg0) throws Exception { 
    MapElement[] mapElements = new MapElement[arg0.size()]; 
    int i = 0; 
    for (Map.Entry<String, ArrayList<Attachment>> entry : arg0.entrySet()){ 
     mapElements[i++] = new MapElement(entry.getKey(), entry.getValue()); 
    } 
    return mapElements; 
} 

public Map<String, ArrayList<Attachment>> unmarshal(MapElement[] arg0) throws Exception { 
    Map<String, ArrayList<Attachment>> r = new HashMap<String, ArrayList<Attachment>>(); 
    for (MapElement mapelement : arg0) 
     r.put(mapelement.key, mapelement.value); 
    return r; 
} 

} 

Я изменил MapElement также

public class MapElement { 
@XmlElement 
public String key; 
@XmlElement 
public ArrayList<Attachment> value; 

private MapElement() { 
} 

public MapElement(String key, ArrayList<Attachment> value) { 
    this.key = key; 
    this.value = value; 
} 
} 

И класс прикрепленного должен иметь методы геттер сеттер

public class Attachment { 
public String getCategory() { 
    return category; 
} 
public void setCategory(String category) { 
    this.category = category; 
} 
private String category; 
public Attachment(String cat){ 
    this.category = cat; 
} 

} 
+0

Значение not coming..i может видеть строковый ключ в ответе, но соответствующее значение пустое – Anand

+0

Привет, Ананд, я обновил ответ, который вы можете посмотреть на него. –

Смежные вопросы