Java: JAXB и использование char
Я работаю над проектом с JAXB, но у меня небольшая проблема с JAXB и типом данных char.
char gender = 'M';
переводится после маршалинга в:
<gender>77</gender>
поэтому я думаю, что char сопоставляется с integer, но я просто хочу сопоставить его со строкой. Как я могу это сделать? Это вообще возможно?
5 ответов
после некоторых экспериментов, похоже, нет способа настроить 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> {
Это все еще кажется проблемой в Metro JAXB (RI), по крайней мере, версия Metro поставляется с JDK 1.6.0_20.
EclipseLink JAXB (MOXy) маршалы char правильно:
для использования EclipseLink JAXB просто добавьте eclipselink.jar к вашему пути к классам и добавьте jaxb.файл свойств с вашими классами моделей со следующей записью:
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 для дополнительной информации.