2010-09-05 11 views
3

Actuellement, JAXB crée une classe de points à partir du schéma xml que j'ai spécifié. Cependant, je préférerais utiliser la classe java.awt.Point existante. Et pour tous les autres types que j'ai définis pour utiliser et importer java.awt.Point aussi.JAXB: définition de complexTypes pour utiliser des classes Java existantes

Voici mon code de point:

<xs:complexType name="point"> 
    <xs:sequence> 
    <xs:element name="x" type="xs:int" /> 
    <xs:element name="y" type="xs:int" /> 
    </xs:sequence> 
</xs:complexType> 

Est-ce possible?

Répondre

3

Je ne sais pas si ma solution est très élégante mais je crois que cela fonctionne comme vous le souhaitez.

Tenir compte classe Test avec une propriété p de type java.awt.Point:

@XmlRootElement 
public class Test { 
    @XmlElement 
    @XmlJavaTypeAdapter(PointAdapter.class) 
    public Point p; 
} 

La classe PointAdapter est la suivante:

class PointAdapter extends XmlAdapter<String, Point> { 

    @Override 
    public String marshal(Point v) throws Exception { 
     return String.format("%d;%d", v.x, v.y); 
    } 

    @Override 
    public Point unmarshal(String v) throws Exception { 
     String[] coords = v.split(";"); 
     return new Point(Integer.parseInt(coords[0]), Integer.parseInt(coords[1])); 
    } 

} 

Si vous ne créez pas vos classes Java à la main, mais laissez-les générer par xjc il est possible de spécifier le XmlAdapter dans le schéma aussi; soit via un fichier de liaison séparé que vous pouvez spécifier avec l'option -b de xjc ou incorporé dans votre XSD. Personnellement je préfère la première solution car cela garde le schéma propre. Depuis un certain temps depuis que j'ai joué avec ce que je vous renvoie à la JAXB documentation (chercher MyDatatypeConverter, ce devrait être la partie la plus pertinente).

+0

Merci! Je vais essayer. – fli