Pergunta

Eu estou trabalhando em um projeto com JAXB, mas eu me deparo com um pequeno problema com JAXB e o tipo de dados de char.

char gender = 'M';

Traduz após triagem em:

<gender>77</gender>

Então eu acho que char é mapeado para número inteiro, mas eu simplesmente deseja mapeá-lo para a cadeia. Como posso fazer isso? Será que é mesmo possível?

Foi útil?

Solução

Depois de algumas experiências, parece haver nenhuma maneira de JAXB configure para lidar com caracteres primitivos corretamente. Estou tendo dificuldade em aceitar isso, porém.

Eu tentei definindo um XmlAdaptor para tentar coagir-lo em um String, mas o tempo de execução parece aceitar apenas adaptadores anotados em tipos de objeto, não primitivos.

A única solução que eu posso pensar é para marcar o campo de char com @XmlTransient, e depois getters escrever e setters que obter e definir o valor como uma string:

   @XmlTransient
   char gender = 'M';

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

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

Não é muito bom, eu vou conceder-lhe, mas com falta de realmente mudar seu campo de char tobe um String, que é tudo que tenho.

Outras dicas

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

Isso é o truque especificar o tipo de fazê-lo funcionar com primitivos

Em seu adaptador

usando o mesmo no pacote-info irá significar que você fazê-lo globalmente para que o pacote

Encontrei este depois de experimentar.

public class MyAdapter extends XmlAdapter<String, Integer> {

A primeira coisa que eu tenho em minha mente:)

String gender = "M";

Este ainda parece ser um problema no Metro JAXB (RI), pelo menos a versão do Metro enviado com JDK 1.6.0_20.

EclipseLink JAXB (MOXY) marechais carbonizar corretamente:

Para usar EclipseLink JAXB simplesmente adicionar eclipselink.jar ao seu classpath e adicionar jaxb.properties arquivo com suas classes de modelo com a seguinte entrada:

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

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

}

então você pode registrá-lo a todo o pacote com package-info.java (evite a esqueceu-lo dentro de alguma outra classe) ou usá-lo especificamente para um determinado campo.

http://blogs.oracle.com/CoreJavaTechTips/entry/exchanging_data_with_xml_and para mais informações.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top