JAXB将空int XML属性替换为0

时间:2010-05-05 17:46:09

标签: java jaxb

JAXB将empty int XML属性替换为0,这对我很好,但我需要将其存储为null。似乎我无法将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()期间从Sun(Oracle)的DataConverterImpl.class调用下面的代码,您的neve将从此代码中获取null:

 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 个答案:

答案 0 :(得分:1)

您可以尝试编写自定义XMLAdaptor,将整数转换为String(或其他对象),然后根据需要将其转换回来。在解组期间,我想象一个快速不区分大小写的'null'检查就是你所需要的。

从这里开始: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;

代码未经测试,但我认为它应该可以解决问题。

答案 1 :(得分:1)

FWIW,我目前发现JAXB将一个空元素解组为零(如果是一个Integer字段),但如果它是一个Long字段则为null。

不可否认,自定义数据类型转换器可能存在某种问题。或者它可能是带有JDK 6.0的JAXB版本的错误,您可能正在使用更高版本。