Я пытаюсь использовать XJC для создания классов Java из схемы XML и файла привязок. Файл привязок предназначен для создания члена типа InetAddress вместо String в сгенерированном классе.
У меня есть следующее:
config.xsd
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="config">
<xsd:complexType>
<xsd:all>
<xsd:element name="ip" type="IPv4Address" />
</xsd:all>
</xsd:complexType>
</xsd:element>
<xsd:simpleType name="IPv4Address">
<xsd:annotation>
<xsd:documentation>
IPv4 address in the dotted-decimal notation.
</xsd:documentation>
</xsd:annotation>
<xsd:restriction base="xsd:string">
<xsd:pattern value="((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])"/>
</xsd:restriction>
</xsd:simpleType>
configBindings.xml
<?xml version="1.0"?>
<jxb:bindings version="2.0"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc">
<jxb:bindings schemaLocation="config.xsd" node="/xsd:schema" >
<jxb:globalBindings>
<jxb:javaType name="InetAddress" xmlType="IPv4Address" parseMethod="InetAddress.getByName" printMethod="getHostAddress" />
</jxb:globalBindings>
</jxb:bindings>
Затем я запускаю XJC с xjc -b configBindings.xml config.xsd
, который генерирует java-код в «сгенерированном» каталоге. Однако, несмотря на то, что тип члена ip
был правильно привязан к InetAddress
, в файле Config.java отсутствует оператор импорта для java.net.InetAddress. Поэтому, когда я пытаюсь скомпилировать Config.java или адаптер Adapter1.java, я получаю несколько ошибок такого рода:
$ javac generated/Adapter1.java
generated/Adapter1.java:14: error: cannot find symbol
extends XmlAdapter<String, InetAddress>
^
symbol: class InetAddress
Должен ли я вручную вставлять необходимые операторы импорта после запуска XJC? Нет ли способа заставить XJC сделать это автоматически, даже если я каким-то образом укажу необходимые пакеты в файле привязки?
ПРИМЕЧАНИЕ. На самом деле я хочу использовать свой собственный класс адаптера для этого, чтобы я мог правильно обрабатывать исключения InetAddress, но этот пример немного упрощает вопрос, даже если сгенерированный код не будет компилироваться после ручного добавления импорта оператор, потому что UnknownHostException не обрабатывается.