Как настроить package-info.java, сгенерированный JAXB2 - PullRequest
8 голосов
/ 12 января 2012

Я использую

<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>

для генерации классов Java из файлов XSD.

Я добавил

<args>-npa</args>

, поэтому плагин негенерировать больше package-info.java, но с этой опцией сгенерированные классы java отличаются (пространство имен добавляется к каждому элементу).

Итак, я не могу настроить пространство имен, используя package-info.java.

Как использовать пользовательское пространство имен без изменения файлов, созданных вручную?

Ответы [ 2 ]

7 голосов
/ 30 мая 2012

Вы можете использовать плагин namespace-prefix из проекта jaxb2-common (заявление об отказе: я написал):

https://github.com/Siggen/jaxb2-namespace-prefix

Это xjc-плагин, который позволяет определить сопоставления пространства имен -> префикса в файле bindings.xml :

<jxb:bindings schemaLocation="eCH-0007-3-0.xsd">
    <jxb:schemaBindings>
        <jxb:package name="ch.ech.ech0007.v3" />
    </jxb:schemaBindings>
    <jxb:bindings>
        <namespace:prefix name="eCH-0007" />
    </jxb:bindings>
</jxb:bindings>

, что приведет к следующей информации о пакете.java генерируемый файл (обратите внимание на добавленную аннотацию XmlNs):

@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.ech.ch/xmlns/eCH-0007/3", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED, xmlns = {
    @javax.xml.bind.annotation.XmlNs(namespaceURI = "http://www.ech.ch/xmlns/eCH-0007/3", prefix = "eCH-0007-3")
})
package ch.ech.ech0007.v3;

Ваш pom.xml будет выглядеть так:

<plugin>
    <groupId>org.jvnet.jaxb2.maven2</groupId>
    <artifactId>maven-jaxb2-plugin</artifactId>
    <version>0.8.0</version>
    <configuration>
        <schemaDirectory>src/main/resources</schemaDirectory>
        <catalog>src/main/resources/catalog.xml</catalog>
        <schemaIncludes>
            <include>*.xsd</include>
        </schemaIncludes>
        <bindingDirectory>src/main/resources</bindingDirectory>
        <bindingIncludes>
            <include>bindings.xml</include>
        </bindingIncludes>
        <args>
            <arg>-extension</arg>
            <arg>-Xnamespace-prefix</arg>
        </args>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>generate</goal>
            </goals>
        </execution>
    </executions>
    <dependencies>
        <dependency>
            <groupId>org.jvnet.jaxb2_commons</groupId>
            <artifactId>jaxb2-namespace-prefix</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>
</plugin>
2 голосов
/ 14 февраля 2013

Вы можете настроить пространство имен, указав JAX-B сгенерировать package-info.java и установить целевое пространство имен, необходимое в вашем XSD.

<xs:schema version="1.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xsi:schemaLocation="http://www.w3.org/2001/XMLSchema http://www.w3.org/2001/XMLSchema.xsd"
    targetNamespace="yourTargetNameSpace"
    xmlns="yourTargetNameSpace"
    elementFormDefault="qualified">
...