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