(のみ)1つの要素を持つリストを正しくシリアル化できないJerseyのバグを解決するには、次のようにします。
"list":"thing"
それ以外の
"list": [ "thing" ]
私はそれをほぼ解決する以下のコードを書きましたが、(腹立たしいことに)結果全体を次のように二重引用符で囲まないように指示する方法はありません:
"list": "[ "thing" ]"
私には選択肢がなく、これを通してはっきりと見える人には心から感謝します。いくつかの投稿で提案されている@ProviderソリューションとしてContextResolver<JAXBContext>も試しましたが、Jerseyがそのコードを呼び出すことはありません。このソリューションだけが近づいています。
ちなみに、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;
}
}