Frage

Ich arbeite an einem Projekt mit JAXB, aber ich laufe in ein kleines Problem mit JAXB und dem char-Datentyp.

char gender = 'M';

Verschiebt nach Rangierung in:

<gender>77</gender>

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

War es hilfreich?

Lösung

Nach einigen Experimenten scheint es keinen Weg, um JAXB zu konfigurieren richtig primitive Zeichen zu behandeln. Ich bin eine harte Zeit, es zu akzeptieren, wenn.

Ich habe versucht, ein XmlAdaptor definieren, um zu versuchen, es in einen String zu zwingen, aber die Laufzeit scheint nur Adapter auf Objekttypen kommentierte zu akzeptieren, nicht Primitiven.

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 abrufen und festlegen:

   @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 dich gewähren, aber kurze tatsächlich Ihr char Feld tobt einen String zu ändern, das ist alles, was ich habe.

Andere Tipps

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

Das ist der Trick Typ angeben, um es mit Primitiven funktioniert

In Ihrem Adapter

das gleiche mit im Paket-info bedeutet, dass Sie es tun global für das Paket

Sie haben diese nach experimentieren.

public class MyAdapter extends XmlAdapter<String, Integer> {

Das erste, was ich habe in meinem Kopf:)

String gender = "M";

Das nach wie vor ein Problem in Metro JAXB (RI), atleast die Version von Metro zu sein scheint ausgeliefert mit JDK 1.6.0_20.

Eclipse JAXB (moxy) Marschälle char richtig:

Eclipse JAXB einfach hinzufügen eclipselink.jar zu Ihrem Classpath nutzen zu können, und fügen Sie ein jaxb.properties mit Ihrem Modellklasse mit folgendem Eintrag Datei in:

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

erstellen eine spezialisierte XMLAdapter:

package br.com.maritima.util;

import javax.xml.bind.annotation.adapters.XmlAdapter;

public class CharAdapter extends XmlAdapter<String,Character>{

 @Override
 public String marshal(Character v) throws Exception {
  return new String(new char[]{v});
 }

 @Override
 public Character unmarshal(String v) throws Exception {
   if(v.length()>0)
   return v.charAt(0);
  else return ' ';
 }

}

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

finden Sie unter http://blogs.oracle.com/CoreJavaTechTips/entry/exchanging_data_with_xml_and für weitere Informationen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top