2010-02-15 14 views
8

Sto provando a eseguire il marshalling di un oggetto che ha un oggetto come uno dei suoi campi.JAXB Marshalling Objects con java.lang.Object field

@XmlRootElement 
public class TaskInstance implements Serializable { 
    ... 
    private Object dataObject; 
    ... 
} 

Il dataObject può essere uno dei molti diversi sconosciuti tipi, quindi specificando ogni posto è non solo impraticabile, ma impossibile. Quando provo a eseguire il marshalling dell'oggetto, si dice che la classe non è nota al contesto.

MockProcessData mpd = new MockProcessData(); 
TaskInstance ti = new TaskInstance(); 
ti.setDataObject(mpd); 

String ti_m = JAXBMarshall.marshall(ti); 

"MockProcessData né alcuno della sua classe eccellente è noto a questo contesto." è quello che ottengo.

C'è qualche modo per aggirare questo errore?

+0

Cosa stai tentando di serializzare MockProcessData a? cioè qual è la rappresentazione desiderata? – mtpettyp

+0

Come utente JAXB per la prima volta, ho esattamente lo stesso problema nel tentativo di eseguire il marshalling di una struttura ad oggetti creata da zero, cioè non creata da un XSD compilato. In effetti, voglio farlo al contrario e generare lo schema dalle classi una volta che il codice funziona. Ho provato a racchiudere il mio oggetto in un JAXBElement come descritto, e ho ottenuto esattamente lo stesso messaggio "Foobar non è noto in questo contesto" come prima, quindi non sono più in avanti. –

+0

Hey Dasmotiu - Ho finito con l'includere l'annotazione @XMLSeeAlso e ho fornito tutte le classi a cui avrebbe potuto provare a rendere unmarshal l'oggetto. Ad esempio: @XmlSeeAlso ({ StringType.class, DecimalType.class, NumericType.class, BooleanType.class, StructType.class, ListType.class, DateType.class, SpatialType.class }) classe Field pubblica pubblica { – jcovert

risposta

6

JAXB non può eseguire il marshall di alcun oggetto vecchio, poiché non sa come. Ad esempio, non saprebbe quale nome dell'elemento utilizzare.

Se è necessario gestire questo tipo di carattere jolly, l'unica soluzione è racchiudere gli oggetti in un oggetto JAXBElement, che contiene informazioni sufficienti affinché JAXB esegua il marshalling in XML.

provare qualcosa di simile:

QName elementName = new QName(...); // supply element name here 
JAXBElement jaxbElement = new JAXBElement(elementName, mpd.getClass(), mpd); 
ti.setDataObject(jaxbElement); 
+0

Sembra buono, ma ho due domande a riguardo. In primo luogo, il nome dell'elemento - non mi è esattamente chiaro a cosa serve, ma suppongo che "dataObject" sia sufficiente? In secondo luogo, JAXBElement è un tipo non elaborato e il compilatore mi avvisa che dovrebbe essere parametrizzato. So che un avvertimento è un avvertimento e non un errore, ma dal momento che sono in un territorio sconosciuto, mi sembra una buona idea saperne di più. Non sono sicuro di cosa potrei parametrizzare con entrambi, dal momento che ho a che fare con 'Oggetti'. Grazie! – jcovert

+0

@jcovert: il nome dell'elemento e lo spazio dei nomi possono essere qualsiasi cosa tu voglia, quindi sì, "dataObject" andrebbe bene. Per quanto riguarda i generici, basta usare 'JaxbElement ', è solo una cosa di compilazione, a JAXB non interessa il runtime. – skaffman

+1

Mi ci sono voluti alcuni minuti per farlo funzionare, ma in effetti questa è una soluzione eccellente. Una piccola modifica (per chiunque potrebbe incontrare lo stesso problema): 'ti.setDataObject (jaxbElement)' dovrebbe essere 'ti.setDataObject (jaxbElement.getValue())' Grazie ancora per l'aiuto! – jcovert

0

Metodo:

public String marshallXML(Object object) { 
     JAXBContext context; 
     try { 
      context = JAXBContext.newInstance(object.getClass()); 
      StringWriter writer = new StringWriter(); 
      Marshaller marshaller = context.createMarshaller(); 
      marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
      marshaller.marshal(object, writer); 
      String stringXML = writer.toString(); 
      return stringXML; 
     } catch (JAXBException e) { 

     } 
} 

Modello:

import javax.xml.bind.annotation.XmlAttribute; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 
@XmlRootElement 
public class Customer { 
    String name; 
    int id; 
    public String getName() { 
     return name; 
    } 
    @XmlElement 
    public void setName(String name) { 
     this.name = name; 
    } 
    public int getId() { 
     return id; 
    } 
    @XmlAttribute 
    public void setId(int id) { 
     this.id = id; 
    } 
} 
Problemi correlati