внешне создавать аннотации jaxb для класса - PullRequest
5 голосов
/ 16 ноября 2011

Итак, обычно я применяю аннотации JAXB в коде следующим образом:

package com.example;

@XmlRootElement(name = "Foo", namespace = "example.com")
@XmlType(name = "Foo", namespace = "example.com")
public class Foo {
    ...
}

Foo - это класс Java, который используется для связи с веб-сервисами (через Spring / CXF).Приведенные выше аннотации помогают правильно сгенерировать XML-схему в wsdl.

Я попал в ситуацию, когда не могу изменить сам класс, но я могу предоставить файл внешнего связывания jaxb для кода, который генерирует схему,Обратите внимание, что @XmlRootElement существует в классе.

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

Ответы [ 2 ]

6 голосов
/ 16 ноября 2011

Если вам просто нужно добавить аннотацию @XmlType(name = "Foo", namespace = "example.com") в сгенерированный класс, вы можете использовать JAXB Annotate Plugin . Здесь - документация о том, как определять аннотации во внешних файлах привязки.

Если вы используете CXF и maven, вы также можете использовать cxf-codegen-plugin как-то так

<plugin>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-codegen-plugin</artifactId>
    <version>${cxf.version}</version>
    <executions>
        <execution>
            <id>generate-sources</id>
            <phase>generate-sources</phase>
            <goals>
                <goal>wsdl2java</goal>
            </goals>
            <configuration>
                <sourceRoot>${service.src.dir}</sourceRoot>
                <wsdlOptions>
                    <wsdlOption>
                        <wsdl>service.wsdl</wsdl>
                        <extraargs>
                            <extraarg>-xjc-Xannotate</extraarg>
                            <extraarg>-b</extraarg>
                            <extraarg>${wsdl.dir}/bindings.xjb</extraarg>
                        </extraargs>
                    </wsdlOption>
                </wsdlOptions>
            </configuration>
        </execution>
    </executions>
    <dependencies>
        <dependency>
            <groupId>org.jvnet.jaxb2_commons</groupId>
            <artifactId>jaxb2-basics-annotate</artifactId>
            <version>${jaxb.commons.version}</version>
        </dependency>
    </dependencies>                
</plugin>

Вы также можете использовать maven-jaxb2-plugin:

<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>${maven-jaxb2.version}</version>
<executions>
    <execution>
        <id>process-xsd</id>
        <goals>
            <goal>generate</goal>
        </goals>
        <phase>generate-sources</phase>
        <configuration>
            <schemaIncludes>
                <include>**/*.xsd</include>
            </schemaIncludes>
            <bindingIncludes>
                <include>**/*.xjb</include>
            </bindingIncludes>
            <generateDirectory>${jaxb.src.dir}</generateDirectory>
            <extension>true</extension>
            <args>
                <arg>-Xannotate</arg>
            </args>
            <plugins>
                <plugin>
                    <groupId>org.jvnet.jaxb2_commons</groupId>
                    <artifactId>jaxb2-basics-annotate</artifactId>
                    <version>${jaxb.commons.version}</version>
                </plugin>
            </plugins>
        </configuration>
    </execution>
</executions>
</plugin>

Вот пример файла привязки:

<jaxb:bindings
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
xmlns:annox="http://annox.dev.java.net"
version="2.0">

    <jaxb:bindings schemaLocation="schema.xsd" node="/xs:schema">
        <jaxb:bindings node="//xs:complexType[@name='Foo']">
            <annox:annotate target="class">
                <annox:annotate annox:class="javax.xml.bind.annotation.XmlType" name="Foo" namespace = "example.com"/>
            </annox:annotate>
        </jaxb:bindings>
    </jaxb:bindings>

</jaxb:bindings>

Если вам тоже нужно изменить @XmlRootElement, просто добавьте еще один annox:annotate элемент:

<annox:annotate annox:class="javax.xml.bind.annotation.XmlRootElement" name="Foo" namespace = "example.com"/>
3 голосов
/ 16 ноября 2011

Примечание: Я EclipseLink JAXB (MOXy) и член JAXB (JSR-222) экспертная группа.

В реализации JAXB для MOXy есть внешний файл отображения, который вы можете использовать для предоставления метаданных.

<?xml version="1.0"?>
<xml-bindings
    xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
    package-name="com.example">
    <java-types>
        <java-type name="Customer">
            <xml-type name="Foo" namespace="example.com"/>
        </java-type>
    </java-types>
</xml-bindings>

Для получения дополнительной информации

...