Domanda

Sto lavorando su un progetto con JAXB, ma ho incontrato un piccolo problema con JAXB e il tipo di dati char.

char gender = 'M';

Traduce dopo smistamento in:

<gender>77</gender>

Quindi penso che char è mappato a intero, ma voglio semplicemente per mappare in una stringa. Come posso fare questo? E 'anche possibile?

È stato utile?

Soluzione

Dopo alcuni esperimenti, sembra che vi sia alcun modo per configurare JAXB per gestire caratteri primitivi correttamente. Sto attraversando un periodo difficile accettarlo, però.

Ho provato la definizione di un XmlAdaptor per cercare di costringere in una stringa, ma il runtime sembra accettare solo adattatori annotati sui tipi di oggetto, non primitive.

L'unica soluzione mi viene in mente è quello di segnare il campo char con @XmlTransient, e poi scrivere getter e setter che ottenere e impostare il valore come stringa:

   @XmlTransient
   char gender = 'M';

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

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

Non è molto bello, l'ammetto, ma a corto di effettivamente cambiare il vostro campo char Tobe una stringa, che è tutto quello che ho.

Altri suggerimenti

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

Questo è il trucco tipo specificare di farlo funzionare con primitive

Nella scheda

utilizzando lo stesso in package-info significherà lo si fa a livello mondiale per quel pacchetto

Ho trovato questo dopo aver sperimentato.

public class MyAdapter extends XmlAdapter<String, Integer> {

La prima cosa che ho ottenuto nella mia mente:)

String gender = "M";

Questo sembra essere ancora un problema in metropolitana JAXB (RI), atleast la versione di Metro fornita con JDK 1.6.0_20.

EclipseLink JAXB (moxy) marescialli char correttamente:

Per usare EclipseLink JAXB è sufficiente aggiungere eclipselink.jar al classpath e aggiungere un file jaxb.properties con le classi del modello con la seguente voce:

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

creare un XMLAdapter specializzata:

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 ' ';
 }

}

quindi è possibile registrarsi per intero pacchetto con package-info.java (evita di dimenticato dentro qualche altra classe) o utilizzare specificamente per un certo campo.

http://blogs.oracle.com/CoreJavaTechTips/entry/exchanging_data_with_xml_and per maggiori informazioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top