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> {

Первое, что пришло мне в голову:)

String gender = "M";

Это все еще кажется проблемой в 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 для дополнительной информации.