Utilizziamo i provider di contenuti XML Jackson jax-rs per la gestione del tipo di contenuto XML nel nostro progetto REST API basato su jax-rs. Nella serializzazione di un elenco di POJO, è necessario impostare dinamicamente il nome dell'elemento xml da un campo nel POJO.Serializzazione Jackson: impostazione del valore del campo come nome dell'elemento XML
public class ResponsePOJO {
@JacksonXmlProperty
@JacksonXmlElementWrapper(useWrapping = false)
private List<Message> message = new ArrayList<Message>();
}
public class Message {
private String type; // "Error" or "Warning"
private String msg; // The actual message
}
predefinito Jackson XML serializzato:.
<ResponsePOJO>
<message>
<type>Error</type>
<msg>Some random error message</msg>
</message>
<message>
<type>Warning</type>
<msg>Some random warning message</msg>
</message>
</ResponsePOJO>
Il nostro fabbisogno, vale a dire, il tipo impostato come il nome dell'elemento XML.
<ResponsePOJO>
<Error>
<msg>Some random error message</msg>
</Error>
<Warning>
<msg>Some random warning message</msg>
</Warning>
</ResponsePOJO>
Al fine di raggiungere questo obiettivo, abbiamo scritto un serializzatore XML personalizzato, nel modo seguente:
public class MessageListSerializer extends
JsonSerializer<List<Message>> {
@Override
public void serialize(List<Message> value, JsonGenerator jgen,
SerializerProvider provider) throws IOException,
JsonProcessingException {
for(Message me : value){
jgen.writeObjectField(me.getType(), me);
}
}
}
e ha aggiunto il serializzatore con annotazione:
@JacksonXmlProperty
@JacksonXmlElementWrapper(useWrapping = false)
@JsonSerialize(using=MessageListSerializer.class)
private List<Message> message = new ArrayList<Message>();
Ma mentre la serializzazione del ResponsePOJO usando Jackson XMLMapper, stiamo ottenendo la seguente eccezione ...
Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: Array index out of range: -2
at com.fasterxml.jackson.dataformat.xml.ser.XmlSerializerProvider.serializeValue(XmlSerializerProvider.java:100)
at com.fasterxml.jackson.databind.ObjectMapper._configAndWriteValue(ObjectMapper.java:2866)
at com.fasterxml.jackson.databind.ObjectMapper.writeValue(ObjectMapper.java:2289)
Caused by: java.lang.ArrayIndexOutOfBoundsException: Array index out of range: -2
at com.ctc.wstx.sw.BufferingXmlWriter.writeRaw(BufferingXmlWriter.java:241)
at com.ctc.wstx.sw.BaseStreamWriter.writeRaw(BaseStreamWriter.java:1113)
at com.fasterxml.jackson.dataformat.xml.ser.ToXmlGenerator.writeRaw(ToXmlGenerator.java:592)
at com.fasterxml.jackson.dataformat.xml.util.DefaultXmlPrettyPrinter$Lf2SpacesIndenter.writeIndentation(DefaultXmlPrettyPrinter.java:517)
at com.fasterxml.jackson.dataformat.xml.util.DefaultXmlPrettyPrinter.writeEndObject(DefaultXmlPrettyPrinter.java:223)
at com.fasterxml.jackson.dataformat.xml.ser.ToXmlGenerator.writeEndObject(ToXmlGenerator.java:422)
at com.fasterxml.jackson.dataformat.xml.ser.XmlBeanSerializer.serialize(XmlBeanSerializer.java:119)
at com.fasterxml.jackson.dataformat.xml.ser.XmlSerializerProvider.serializeValue(XmlSerializerProvider.java:92)
... 3 more
La prego di aiutarmi a risolvere questo problema ...
Grazie per la risposta. Anche in questo caso, come possiamo impostare "Errore" e "Avviso" come nome dell'elemento XML, senza creare elenchi separati per i messaggi "Errore" e "Avviso". – dinup24
Per essere più specifici, ho bisogno di mantenere l'ordine di questi messaggi e quindi utilizzare una lista singola Lista per memorizzare sia oggetti di errore che di avviso. In questo caso, è possibile impostare il nome della sottoclasse come nome dell'elemento XML. –
dinup24