Вопрос

Я работаю над проектом с 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 для получения дополнительной информации.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top