2009-09-23 10 views
5

Ich arbeite an einem Projekt mit JAXB, aber ich stoße auf ein kleines Problem mit JAXB und den Char-Datentyp.Java: JAXB und die Verwendung von char

char gender = 'M'; 

Verschiebt nach Rangierung in:

<gender>77</gender> 

Ich denke also, dass char auf Integer abgebildet, aber ich will es einfach in einen String kartieren. Wie kann ich das machen? Ist es überhaupt möglich?

+1

Speichern Sie Geschlecht nicht als ein Zeichen und verwenden Sie stattdessen eine 'enum'. Es ist nicht nur viel typsicherer, sondern man kann es auch nach Belieben abbilden ;-) –

+0

@Joachim Sauer: Du hast recht, wenn du sagst, dass Enum eine bessere Option wäre, das Geschlecht zu speichern. Aber ich erkunde die Möglichkeiten von JAXB. Und ich bin stur, also dachte ich, es muss eine Lösung mit char: -p geben – Korenaga

+0

Dies ist ein Fehler in einer bestimmten Implementierung von JAXB (Metro), andere Implementierungen von JAXB (EclipseLink MOXy) Marshal Char korrekt. –

Antwort

5

Nach einigen Experimenten scheint es keinen Weg, um JAXB zu konfigurieren richtig primitive Zeichen zu behandeln. Es fällt mir allerdings schwer, das zu akzeptieren.

Ich habe versucht, eine XmlAdaptor zu definieren, um es in eine Zeichenfolge zu versuchen und zu erzwingen, aber die Laufzeit scheint nur Adapter zu akzeptieren, die mit Objekttypen, nicht mit Primitiven versehen sind.

Die einzige Abhilfe, die ich denken kann, ist das Zeichen Feld mit @XmlTransient zu markieren, und dann Getter und Setter schreiben, die den Wert als String erhalten und eingestellt:

@XmlTransient 
    char gender = 'M'; 

    @XmlElement(name="gender") 
    public void setGenderAsString(String gender) { 
     this.gender = gender.charAt(0); 
    } 

    public String getGenderAsString() { 
     return String.valueOf(gender); 
    } 

Nicht sehr schön, ich werde gewähre dir, aber kurz davor, dein Charfeld zu einem String zu ändern, das ist alles was ich habe.

+0

Dieses Problem bezieht sich speziell auf die Metro-Implementierung von JAXB, andere Implementierungen von JAXB (EclipseLink MOXy) behandeln diesen Anwendungsfall korrekt. –

1

erste, was ich in meinem Kopf habe :)

String gender = "M"; 
1

Dies scheint immer noch ein Problem in Metro JAXB (der RI), zumindest die Version von Metro mit JDK 1.6.0_20 ausgeliefert.

Eclipse JAXB (moxy) Marschälle char richtig:

nutzen zu Eclipse JAXB einfach eclipselink.jar zu Ihrem Classpath hinzufügen und fügen Sie ein jaxb.properties mit Ihrem Modell Klassen-Datei in mit folgendem Eintrag:

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory 
0

eine spezialisierte XMLAdapter erstellen:

dann können Sie es mit package-info.java zum gesamten Paket registrieren (vermeiden Sie, es in einer anderen Klasse zu vergessen) oder verwenden Sie es speziell für ein bestimmtes Feld.

siehe http://blogs.oracle.com/CoreJavaTechTips/entry/exchanging_data_with_xml_and für weitere Informationen.

+1

Ich bin neugierig, warum '' neue Zeichenfolge (neue char [] {v}) 'anstelle von' v.toString() '? –

2
@XmlJavaTypeAdapter(value=MyAdapter.class, type=int.class) 

Das ist der Trick Typ angeben, um es

In Ihrem Adapter mit Primitiven funktioniert

das gleiche in Paket-Info unter Verwendung bedeutet, dass Sie es für das Paket global tun

gefunden das nach dem Experimentieren.

public class MyAdapter extends XmlAdapter<String, Integer> {