2010-03-16 5 views
1

Comment est-ce que je peux lier jaxb à mon vecteur? Je ne peux pas sembler l'obtenir pour lier un vecteur qui contient des génériques car il se plaint qu'il ne peut pas reconnaître ma classe "forme" ou l'un de ses sous-types .. "[javax.xml.bind.JAXBException: classe shape.shape ni aucun de ses super classe est connue dans ce contexte.] "?Java: jaxb Generircs

import java.util.Vector; 
import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 
@XmlAccessorType(XmlAccessType.NONE) 
@XmlRootElement(name = "XVector") 
public class XVector<shape> { 

    private Vector<shape> q; 

    public XVector() {} 

    @XmlElement(name = "q") 
    public Vector<shape> getVector() { 
     return q; 
    } 

    public void setVector(Vector<shape> q) { 
     this.q = q; 
    } 
} 

Je reçois les erreurs suivantes:

javax.xml.bind.MarshalException 
- with linked exception: 
[javax.xml.bind.JAXBException: class shape.Rectangle nor any of its super class is known to this context.] 
     at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:317) 
     at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:243) 
     at javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:75) 

public void saveFile(File filename) { 
    try { 
     FileOutputStream fout = new FileOutputStream(filename); 
     objs.setVector(objVec); 
     JAXBContext context = JAXBContext.newInstance(XVector.class); 
     Marshaller marshaller = context.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 

     marshaller.marshal(objs, fout); 
     fout.close(); 
    } catch (JAXBException e) { 
     e.printStackTrace(); 
    } catch (Exception ex) { 
     JOptionPane.showMessageDialog(this, ex.toString(), "Error", JOptionPane.ERROR_MESSAGE); 
    } 
} 

Répondre

2

Vous devez inclure toutes les classes nécessaires dans le JAXBContext

JAXBContext context = JAXBContext.newInstance(XVector.class, shape.class); 

(Note: la convention stipule que Shape devrait être capitalisé)

+0

Merci et honte à moi de ne pas avoir capitalisé ma classe. J'ai également trouvé ce lien utile car il a nettoyé mon xml: http://weblogs.java.net/blog/2005/09/30/using-jaxb-20s-xmljavatypeadapter –