Java - Язык:JAXB и использование символа
-
13-09-2019 - |
Вопрос
Я работаю над проектом с JAXB, но я столкнулся с небольшой проблемой с JAXB и типом данных char.
char gender = 'M';
Преобразуется после сортировки в:
<gender>77</gender>
Поэтому я думаю, что char сопоставляется с integer , но я просто хочу сопоставить его со строкой.Как я могу это сделать?Возможно ли это вообще?
Решение
После некоторых экспериментов, похоже, нет способа настроить JAXB для правильной обработки примитивных символов.Тем не менее, мне трудно принять это.
Я попытался определить XmlAdaptor
попытаться принудительно преобразовать его в строку, но среда выполнения, похоже, принимает только адаптеры, аннотированные к типам объектов, а не примитивы.
Единственное обходное решение, которое я могу придумать, - это пометить поле char символом @XmlTransient
, а затем напишите получатели и установщики , которые получают и устанавливают значение в виде строки:
@XmlTransient
char gender = 'M';
@XmlElement(name="gender")
public void setGenderAsString(String gender) {
this.gender = gender.charAt(0);
}
public String getGenderAsString() {
return String.valueOf(gender);
}
Не очень красиво, я согласен с вами, но если не считать фактического изменения вашего поля char на строку, это все, что у меня есть.
Другие советы
@XmlJavaTypeAdapter(value=MyAdapter.class, type=int.class)
Вот в чем хитрость укажите тип, чтобы заставить его работать с примитивами
В вашем адаптере
использование того же самого в package-info будет означать, что вы делаете это глобально для этого пакета
Нашел это после экспериментов.
public class MyAdapter extends XmlAdapter<String, Integer> {
Первое, что пришло мне в голову :)
String gender = "M";
Похоже, это все еще является проблемой в Metro JAXB (RI), по крайней мере, в версии Metro, поставляемой с JDK 1.6.0_20.
Маршалы EclipseLink JAXB (MOXy) правильно отображают символы:
Чтобы использовать EclipseLink JAXB, просто добавьте eclipselink.jar в свой classpath и добавьте файл jaxb.properties к вашим классам модели со следующей записью:
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
создайте специализированный XmlAdapter:
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 ' ';
}
}
затем вы можете зарегистрировать его во всем пакете с помощью package-info.java (избегайте того, чтобы забыть его внутри какого-либо другого класса) или использовать его специально для определенного поля.
видишь http://blogs.oracle.com/CoreJavaTechTips/entry/exchanging_data_with_xml_and для получения дополнительной информации.