В JAXB-дереве пустой атрибут int XML имеет значение 0 - PullRequest
7 голосов
/ 05 мая 2010

JAXB treet устанавливает пустой атрибут int XML как 0, что мне подходит, но у меня есть требование хранить его как ноль. Кажется, я не могу изменить класс DataConverterImpl для пользовательской реализации. Что можно сделать, если вообще?

<xs:attribute name="Count" type="Integer0to999" use="optional">

<xs:simpleType name="Integer0to999">
    <xs:annotation>
      <xs:documentation xml:lang="en">Used for Integer values, from 0 to 999 inclusive</xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:integer">
      <xs:minInclusive value="0"/>
      <xs:maxInclusive value="999"/>
    </xs:restriction>
  </xs:simpleType>

После компиляции схемы xjc я получил класс со следующим:

 @XmlAttribute(name = "Count")
    protected Integer passengerCount;

Во время синтаксического анализа XML parseInt() вам звонят из DataConverterImpl.class из Sun (Oracle), код которого приведен ниже, вы никогда не получите ноль из этого кода:

 public static int _parseInt(CharSequence s) {
        int len = s.length();
        int sign = 1;

        int r = 0;

        for( int i=0; i<len; i++ ) {
            char ch = s.charAt(i);
            if(WhiteSpaceProcessor.isWhiteSpace(ch)) {
                // skip whitespace
            } else
            if('0'<=ch && ch<='9') {
                r = r*10 + (ch-'0');
            } else
            if(ch=='-') {
                sign = -1;
            } else
            if(ch=='+') {
                ; // noop
            } else
                throw new NumberFormatException("Not a number: "+s);
        }

        return r*sign;
    }

Ответы [ 2 ]

1 голос
/ 17 января 2011

FWIW, в настоящее время я обнаруживаю, что JAXB отменяет маршалирование пустого элемента до нуля (если поле Integer), но до нуля, если это поле Long.

Правда, это может быть какая-то проблема с пользовательскими преобразователями типов данных. Или это может быть ошибка в версии JAXB с JDK 6.0, и вы можете использовать более позднюю версию.

1 голос
/ 02 сентября 2010

Вы можете попытаться написать собственный XMLAdaptor, который преобразует ваше целое число в строку (или другой объект), а затем конвертирует его обратно, как вам удобно Во время демаршаллинга, я думаю, что быстрая проверка без 'регистра' для нуля - это все, что вам нужно.

Начните здесь: http://download.oracle.com/javase/6/docs/api/javax/xml/bind/annotation/adapters/XmlAdapter.html

Присоедините адаптер к полю int и напишите тело.

Ваш конвертер запустится следующим образом:

public class MyIntConverter extends XmlAdapter<String,Integer> 
{
    @Override
    public String marshal(Integer value) throws Exception {

        if ( value.intValue() == 0 )
                   return null;  // Or, "null" depending on what you'd like

            return value.toString();
    }

    @Override
    public Integer unmarshal(String storedValue) throws Exception {

        if ( storedValue.equalsIgnoreCase("null") )
                   return 0;

            return Integer.valueOf(storedValue);
    }
}

Затем вы можете использовать его:

@XmlJavaTypeAdapter(MyIntConverter.class)
int someNumber;

Код не проверен, но я думаю, что это должно решить проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...