2010-05-05 4 views
7

JAXB treets 빈 int XML 속성은 0으로 나와 괜찮지 만 null로 저장할 필요가 있습니다. DataConverterImpl 클래스를 사용자 정의 구현으로 변경할 수없는 것 같습니다. 그렇다면 무엇을 할 수 있습니까? 코드는 다음과 같습니다 일 (오라클)에서 DataConverterImpl.class에서 parseInt()을 호출되는 구문 분석 XML 동안JAXB treets empty int XML 속성 0으로 0

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

, 당신의 만년설이가는 :

<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를 스키마 컴파일 후 나는 다음과 클래스를 가지고 이 코드에서 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; 
    } 

답변

1

당신은 d 정수를 String (또는 다른 객체)로 변환하는 사용자 정의 XMLAdaptor를 작성한 다음 적절하게 다시 변환하십시오. 언 마샬링 (unmarshalling) 동안, 'null'에 대한 대소 문자를 구별하지 않는 빠른 검사가 필요할 것이라고 생각합니다. 여기

시작 : http://download.oracle.com/javase/6/docs/api/javax/xml/bind/annotation/adapters/XmlAdapter.html

이 INT 필드에 어댑터를 연결하고 몸을 작성합니다.

@XmlJavaTypeAdapter(MyIntConverter.class) 
int someNumber; 

코드는 테스트되지 않은,하지만 난이 문제를 해결해야한다고 생각 :

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); 
    } 
} 

그런 다음, 당신은 그것을 사용하는 넣을 수 다음과 같이

귀하의 컨버터는 시작합니다.

1

FWIW, 현재 JAXB는 빈 요소를 0으로 (Integer 필드 인 경우) 비 정렬하지만 Long 필드 인 경우 null로 비 정렬합니다.

분명히 사용자 지정 데이터 형식 변환기에 문제가있을 수 있습니다. 또는 JDK 6.0이있는 JAXB 버전의 버그 일 수 있으며 이후 버전을 사용 중일 수 있습니다.