При создании 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;
Проблема с int заключается в том, что она не поддерживает значение null, Integer делает. –
Все верно, но мой вопрос был не о целевом java-типе, а о созданной аннотации '@ XmlElement'. Также, если бы я мог изменить XSD на использование 'xs: int' (чего я не могу, именно поэтому я использую адаптер), я подозреваю, что JAXB будет генерировать' int' ** OR ** 'Integer' , в зависимости от нулевой поля. –
Указание 'type =" int "' дает 'int', указывая' minOccurs = 0' с 'type =" int "' дает 'Integer'. –