Для того, чтобы решить эту ошибку в Джерси, который не правильно сериализации список с (только) один элемент, а именно:Расширение XMLAdapter для обработки ArrayList покрывающей [...] с кавычками
"list":"thing"
вместо из
"list": [ "thing" ]
Я написал код, ниже которого почти решает, но (раздражающе) не дает мне никакого способа узнать это не вложить весь результат в двойных кавычках, как это:
"list": "[ "thing" ]"
У меня нет вариантов, и я буду благодарен всем, кто ясно видит это. Обратите внимание, что я также попытался найти решение, предлагаемое несколькими сообщениями там, но Джерси никогда не вызывает этот код вообще. Это решение единственное, что подходит близко.
Кстати, вот поле потребляющих в 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. Теперь это работает. Я собираюсь опубликовать это решение здесь как ответ, но не как ответ. Возможно, все равно стоит ответить (или, по крайней мере, poo-pooing) на этот вопрос. –