Pregunta

Estoy trabajando en un proyecto con JAXB pero me encuentro con un pequeño problema con JAXB y el tipo de datos char.

char gender = 'M';

Traduce después de cálculo de referencias en:

<gender>77</gender>

Así que creo que la carbonización se asigna a un entero, pero simplemente quiero asignarlo a una cadena. ¿Cómo puedo hacer esto? ¿Es posible?

¿Fue útil?

Solución

Después de algunos experimentos, no parece haber ninguna manera de configurar JAXB para manejar caracteres primitivos correctamente. Estoy teniendo dificultades para aceptar que, sin embargo.

He intentado definir una XmlAdaptor para tratar de coaccionar en una cadena, pero el tiempo de ejecución parece aceptar solamente adaptadores anotados en los tipos de objeto, no primitivos.

La única solución que se me ocurre es marcar el campo carbón con @XmlTransient, y luego escribir captadores y definidores, que obtener y establecer el valor como una cadena:

   @XmlTransient
   char gender = 'M';

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

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

No es muy agradable, te lo concedo, pero por debajo de cambiar realmente su campo carbón Tobe una cadena, eso es todo lo que tengo.

Otros consejos

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

Eso es el truco especifique el tipo de hacer que funcione a partir de primitivas

En su adaptador

utilizando el mismo paquete de información-significará lo haces a nivel mundial para ese paquete

Encontrados esto después de la experimentación.

public class MyAdapter extends XmlAdapter<String, Integer> {

Lo primero que tengo en mi mente:)

String gender = "M";

Esto todavía parece ser un problema en Metro JAXB (la RI), al menos la versión de Metro envía con JDK 1.6.0_20.

EclipseLink JAXB (MOXY) mariscales CHAR correctamente:

Para usar EclipseLink JAXB sólo tiene que añadir eclipselink.jar a la ruta de clases y añadir un archivo de jaxb.properties con las clases del modelo con la siguiente entrada:

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

crear un XmlAdapter especializada:

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

}

a continuación, puede registrarlo en el paquete entero con package-info.java (evitar que se olvidó en el interior alguna otra clase) o lo utiliza específicamente para un determinado campo.

http://blogs.oracle.com/CoreJavaTechTips/entry/exchanging_data_with_xml_and para obtener más información.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top