2009-09-23 3 views
5

Я работаю над проектом с JAXB, но у меня возникает небольшая проблема с JAXB и типом данных char.Java: JAXB и использование char

char gender = 'M'; 

Переводит после сортировочной в:

<gender>77</gender> 

Так что я думаю, что символ отображается в целом, но я просто хочу, чтобы отобразить его в строку. Как я могу это сделать? Возможно ли это?

+1

Не храните пол как символ и вместо него используйте 'enum'. Мало того, что это гораздо более безопасный тип, но вы также можете отобразить его, но вы хотите ;-) –

+0

@Joachim Sauer: Вы правы, говоря, что enum будет вариантом beter для хранения пола. Но я изучаю возможности JAXB. И я упрямый, поэтому я просто решил, что должно быть решение использовать char: -p – Korenaga

+0

Это ошибка в одной конкретной реализации JAXB (Metro), а также другие реализации маркера JAXB (EclipseLink MOXy). –

ответ

5

После нескольких экспериментов, кажется, нет никакого способа, чтобы настроить JAXB обрабатывать примитивные символы правильно. Тем не менее, мне сложно его принять.

Я попытался определить XmlAdaptor, чтобы попытаться принудить его к String, но среда исполнения, похоже, принимает только адаптеры, аннотированные по типам объектов, а не примитивам.

Единственный способ решения проблемы я могу думать о том, чтобы отметить поле обугленного с @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 на String, вот и все, что у меня есть.

+0

Эта проблема связана конкретно с реализацией JAXB Metro, другие реализации JAXB (EclipseLink MOXy) правильно обрабатывают этот случай использования. –

1

Первая вещь, которую я получил в моей голове :)

String gender = "M"; 
1

Это все еще кажется проблемой в Metro JAXB (RI), по крайней мере, версия Metro поставляется с JDK 1.6.0_20.

EclipseLink JAXB (Moxy) маршалы обугливается правильно:

Чтобы использовать EclipseLink JAXB просто добавить eclipselink.jar в свой путь к классам и добавьте jaxb.properties файл в вашей модели классов с помощью следующей записи:

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory 
0

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

+1

Мне любопытно, зачем 'new String (new char [] {v})' вместо 'v.toString()'? –

2
@XmlJavaTypeAdapter(value=MyAdapter.class, type=int.class) 

Thats трюк указать тип, чтобы заставить его работать с примитивами

В адаптере

используя то же самое в пакете-инфо будет означать, что вы делаете это глобально для этого пакета

Найдено это после экспериментов.

public class MyAdapter extends XmlAdapter<String, Integer> { 
Смежные вопросы