2013-04-29 2 views
6

При создании Java-компонентов из XSD с XJC мне нужно сопоставить xs:integer с Integer, а не BigInteger. Я добавил тег javaType в свой файл настройки JAXB (как сказано во многих ответах с этого сайта), и он отлично работал.JAXB javaType customization on xs: integer создает @XmlElement с «type = String.class»

Но в сгенерированном коде я заметил, что тег @XmlElement теперь имеет параметр type=String.class.

Так что теперь интересно, почему String?
Это потому, что методы синтаксического анализа и печати преобразуются из/в строковые объекты?

Я попытался с xjc:javaType вместо jaxb:javaType, что позволяет мне заменить сгенерированный Adapter1<String, Integer> с обычаем MyAdapter<BigInteger, Integer>, но точно то же самое произошло.

Если это нормальное поведение XJC, можно ли его настроить для генерации кода без этого параметра или с другим значением, чем String?

Обратите внимание, что все работает нормально, но я хотел бы понять.
Также я использую Enunciate для документирования моего API и, похоже, это смущает эта вещь type (но это, вероятно, ошибка в Enunciate).


Я использую JAXB RI 2.2.6, и вот некоторые фрагменты кода, чтобы проиллюстрировать мой вопрос:

bindings.xjb

<jaxb:bindings version="2.0" ...> 
    <jaxb:globalBindings> 
     <jaxb:javaType 
       name="java.lang.Integer" 
       xmlType="xs:integer" 
       parseMethod="..." 
       printMethod="..." /> 
     </jaxb:globalBindings> 
</jaxb:bindings> 

Определение поля в XSD

<xs:complexType name="MyType"> 
    <xs:sequence> 
     <xs:element name="myField" type="xs:integer" /> 
    </xs:sequence> 
</xs:complexType> 

Сгенерированного Java поля

@XmlElement(namespace = "...", required = true, type = String.class) 
@XmlJavaTypeAdapter(Adapter1.class) 
@XmlSchemaType(name = "integer") 
protected Integer myField; 

ответ

6

Я знаю, что это старый вопрос, но для людей, все еще ищет ответ: используя тип xs:int вместо xs:integer создаст нормальный Java Int вместо Biginteger.

+0

Проблема с int заключается в том, что она не поддерживает значение null, Integer делает. –

+0

Все верно, но мой вопрос был не о целевом java-типе, а о созданной аннотации '@ XmlElement'. Также, если бы я мог изменить XSD на использование 'xs: int' (чего я не могу, именно поэтому я использую адаптер), я подозреваю, что JAXB будет генерировать' int' ** OR ** 'Integer' , в зависимости от нулевой поля. –

+2

Указание 'type =" int "' дает 'int', указывая' minOccurs = 0' с 'type =" int "' дает 'Integer'. –

Смежные вопросы