Question

Je travaille sur un projet avec JAXB mais je courir dans un petit problème avec JAXB et le type char.

char gender = 'M';

après triage en Traduit:

<gender>77</gender>

Je pense donc que l'omble est mappé en entier, mais je veux simplement la carte à une chaîne. Comment puis-je faire ceci? Est-il même possible?

Était-ce utile?

La solution

Après quelques essais, il semble y avoir aucun moyen de configurer JAXB pour gérer les caractères primitifs correctement. Je vais avoir du mal à accepter, cependant.

J'ai essayé de définir un XmlAdaptor pour essayer de forcer dans une chaîne, mais le moteur d'exécution semble accepter uniquement des adaptateurs annotées sur les types d'objet, pas primitives.

La seule solution que je peux penser est de marquer le champ char avec @XmlTransient, puis écrire des accesseurs qui obtiennent et définissez la valeur en tant que chaîne:

   @XmlTransient
   char gender = 'M';

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

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

Pas très agréable, je vous accorde, mais à court de changer réellement votre champ char Tobe une chaîne, qui est tout ce que j'ai.

Autres conseils

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

Cest l'astuce spécifier le type pour le faire fonctionner avec des primitives

Dans votre adaptateur

en utilisant le même dans le paquet-info signifie que vous le faites dans le monde pour ce paquet

trouvé cela après l'expérimentation.

public class MyAdapter extends XmlAdapter<String, Integer> {

La première chose que je suis arrivé dans mon esprit:)

String gender = "M";

Il semble toujours être un problème dans la région métropolitaine JAXB (RI), atleast la version de Metro livré avec JDK 1.6.0_20.

EclipseLink maréchaux JAXB (Moxy) char correctement:

Pour utiliser EclipseLink JAXB ajoutez simplement eclipselink.jar à votre classpath et ajouter un fichier jaxb.properties avec vos classes de modèle avec l'entrée suivante:

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

créer une XMLAdapter spécialisée:

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

}

vous pouvez l'enregistrer sur paquet entier avec package-info.java (éviter de oublia à l'intérieur d'une autre classe) ou l'utiliser spécifiquement pour un certain domaine.

voir http://blogs.oracle.com/CoreJavaTechTips/entry/exchanging_data_with_xml_and Pour de plus amples informations.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top