Java: JAXB e usando carvão
-
13-09-2019 - |
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?
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.