2010-08-26 14 views
3

il y a des types:JAXB génériques placier ang (2)

class A{} 

@XmlAccessorType(XmlAccessType.PUBLIC_MEMBER) 
@XmlType(propOrder = {"obj"}) 
@XmlRootElement(name = "response") 
public class B<T extends A> extends A{ 
    private T obj; 

    @XmlElement(required = true) 
    public T getObj() { 
    return obj; 
    } 
} 

Quand je suis en train de rassembler ce que je reçois une erreur:

org.springframework.oxm.MarshallingFailureException: JAXB marshalling exception; nested exception is javax.xml.bind.MarshalException 
- with linked exception: 
[com.sun.istack.internal.SAXException2: unable to marshal type "com.my.B" as an element because it is missing an @XmlRootElement annotation] 

Est-ce que jaxbMarshaller fonctionne avec générique? Des idées?

grâce

Répondre

1

Comment votre JAXBContext se crée? Vous devrez vous assurer qu'il connaît B.class. Vous devrez peut-être utiliser l'annotation @XmlSeeAlso.

Compte tenu de ce qui suit:

public class A { 

} 

et:

import javax.xml.bind.annotation.*; 

@XmlAccessorType(XmlAccessType.PUBLIC_MEMBER) 
@XmlType(propOrder = {"obj"}) 
@XmlRootElement(name = "response") 
public class B<T extends A> extends A { 

    private T obj; 

    @XmlElement(required = true) 
    public T getObj() { 
    return obj; 
    } 

    public void setObj(T obj) { 
     this.obj = obj; 
    } 

} 

Quand je lance:

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.Marshaller; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(B.class); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     B b = new B(); 
     b.setObj(new A()); 
     marshaller.marshal(b, System.out); 

    } 

} 

Je reçois:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<response> 
    <obj/> 
</response> 

Et quand je lance:

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.Marshaller; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(B.class); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     B b = new B(); 
     b.setObj(new B()); 
     marshaller.marshal(b, System.out); 

    } 

} 

Je reçois:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<response> 
    <obj xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="b"/> 
</response> 
+0

je suis en train de rassembler instance de la classe suivante: public class B extends A { ...} O WH C est sous-classe de A – roman

+0

J'ai mis à jour ma réponse, il peut être lié à la façon dont votre JAXBContext est créé. –

+0

hey Blaise, je ne pouvais pas comprendre ce qui provoque l'espace de noms à se produire dans la seconde. Je suis confronté à un problème similaire où les génériques sont imprimés avec namespcae (schéma) infor alors que les classes de béton sont très bien, gentil xml. Pouvez-vous pont pour moi comment s'y prendre? J'utilise d'ailleurs les annotations et j'ai essayé de spécifier @XmlSchema au niveau de pacjkage et de type mais sans succès. –