externally create jaxb annotations for class

落爺英雄遲暮 提交于 2019-12-21 02:17:52

问题


So, usually I apply JAXB annotations in the code as follows:

package com.example;

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

Foo is a java class that is used to communicate with web services (via Spring/CXF). The above annotations, help generate the XML Schema in the wsdl appropriately.

I have hit a situation where I can not modify the class itself, but I can provide an jaxb external binding file to the code that generates the schema. Note that the @XmlRootElement exists in the class.

How do I write an equivalent binding file that does what the above annotations do?


回答1:


If you just need to add @XmlType(name = "Foo", namespace = "example.com") annotation to the generated class you can use JAXB Annotate Plugin. Here is documentation about how to define annotations in external binding files.

If you're using CXF and maven you can also you cxf-codegen-plugin somehow like this

<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>

You can also use 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>

Here is sample binding file:

<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>

If you need to modify @XmlRootElement too, just add another one annox:annotate element:

<annox:annotate annox:class="javax.xml.bind.annotation.XmlRootElement" name="Foo" namespace = "example.com"/>



回答2:


Note: I'm the EclipseLink JAXB (MOXy) lead and a member of the JAXB (JSR-222) expert group.

The MOXy implementation of JAXB has an external mapping file that you can use to provide the metadata.

<?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>

For More Information

  • http://blog.bdoughan.com/2010/12/extending-jaxb-representing-annotations.html


来源:https://stackoverflow.com/questions/8143323/externally-create-jaxb-annotations-for-class

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!