2013-03-13 15 views
0

爲了解決在澤西島是不能正確使用序列(只有)一個元素,以機智列表中的錯誤:擴展XmlAdapter的處理ArrayList的封閉[...]用引號

"list":"thing" 

代替的

"list": [ "thing" ] 

我已經寫了這以下非常接近解決它,但(僵硬),讓我沒有辦法告訴它不包圍整個結果在雙引號這樣的代碼:

"list": "[ "thing" ]" 

我沒有選擇,並會非常感謝任何人通過此看清楚。請注意,我也嘗試使用ContextResolver < JAXBContext>作爲@Provider解決方案,該解決方案由一些帖子在那裏提出,但澤西島從未調用過該代碼。這個解決方案是唯一接近的解決方案。

順便說一句,這裏的POJO的消費領域:

@XmlAnyElement 
@XmlJavaTypeAdapter(JaxBListAdapter.class) 
private List<String> list = new ArrayList<String>(); 

而這裏的代碼:

public class JaxBListAdapter extends XmlAdapter< Element, List<String> > 
{ 
    private static Logger log = Logger.getLogger(JaxBListAdapter.class); 

    private DocumentBuilder documentBuilder = 
        DocumentBuilderFactory.newInstance().newDocumentBuilder(); 

    @Override 
    public Element marshal(List<String> list) 
    { 
     Document document = documentBuilder.newDocument(); 
     Element rootElement = document.createElement("list"); 

     document.appendChild(rootElement); 

     if(list != null) 
     { 
      StringBuilder sb = new StringBuilder(); 

      sb.append("[ "); 

      boolean first = true; 

      for(String item : list) 
      { 
       if(first) 
        first = false; 
       else 
        sb.append(", "); 

       sb.append("\"" + item + "\""); 
      } 

      sb.append(" ]"); 

      rootElement.setTextContent(sb.toString()); 
     } 

     return rootElement; 
    } 

    @Override 
    public List<String> unmarshal(Element rootElement) 
    { 
     // Hmmmm... never callled? 
     NodeList  nodeList = rootElement.getChildNodes(); 
     List<String> list  = new ArrayList<String>(nodeList.getLength()); 

     for(int x = 0; x < nodeList.getLength(); x++) 
     { 
      Node node = nodeList.item(x); 

      if(node.getNodeType() == Node.ELEMENT_NODE) 
       list.add(node.getTextContent()); 
     } 

     return list; 
    } 
} 
+0

呃,事實證明ContextResolver /@ Provider不工作是錯誤的。我終於意識到,我確實需要在web.xml中告訴澤西。現在它可以工作。我將在這裏發佈解決方案作爲答案,但不是答案。這個問題可能還是值得回答的(或者至少是嘲笑)。 – 2013-03-13 18:38:41

回答

0

我希望我不會,身邊工作張貼這得罪任何人,有些人可能會被指責爲與原始問題毫不相關或只是傾斜相關。這是我試圖用問題中的方法解決的問題的解決方案。有人看着這個問題出於同樣的原因可能會覺得這很有用。

最終,解決方案使用ContextResolver < JAXBContext>的作品。

這裏是我的代碼:

package com.acme.web.user.pojo; 

import java.util.Arrays; 
import java.util.HashSet; 
import java.util.Set; 

import javax.ws.rs.ext.ContextResolver; 
import javax.ws.rs.ext.Provider; 
import javax.xml.bind.JAXBContext; 
import javax.xml.bind.JAXBException; 

import com.sun.jersey.api.json.JSONConfiguration; 
import com.sun.jersey.api.json.JSONJAXBContext; 

/** 
* This class will solve lists containing only one member which Jersey doesn't bracket. 
* It ensures the brackets [ ... ] in generated JSON. 
*/ 
@Provider 
public class JaxBContextResolver implements ContextResolver<JAXBContext> 
{ 
    private final JAXBContext context; 

    @SuppressWarnings("rawtypes") 
    private final Set<Class> types; 

    @SuppressWarnings("rawtypes") 
    private final Class[] classTypes = { Account.class }; 

    @SuppressWarnings("rawtypes") 
    public JaxBContextResolver() throws JAXBException 
    { 
     context = new JSONJAXBContext(JSONConfiguration.natural().build(), classTypes); 
     types = new HashSet<Class>(Arrays.asList(classTypes)); 
    } 

    public JAXBContext getContext(Class<?> objectType) 
    { 
     return types.contains(objectType) ? context : null; 
    } 
} 

但是,你必須將包添加到web.xml中過或澤西不會去尋找這個類作爲一個@Provider

<init-param> 
    <param-name>com.sun.jersey.config.property.packages</param-name> 
    <param-value>com.acme.web.user.pojo</param-value> 
</init-param>