【问题标题】:externally create jaxb annotations for class在外部为类创建 jaxb 注释
【发布时间】:2012-08-12 12:26:53
【问题描述】:

所以,通常我在代码中应用JAXB注解如下:

package com.example;

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

Foo 是一个 java 类,用于与 Web 服务通信(通过 Spring/CXF)。上述注解,有助于在 wsdl 中适当地生成 XML Schema。

我遇到了无法修改类本身的情况,但我可以为生成模式的代码提供一个 jaxb 外部绑定文件。请注意,@XmlRootElement 存在于类中。

如何编写一个等效的绑定文件来完成上述注释的作用?

【问题讨论】:

    标签: web-services annotations jaxb jax-ws cxf


    【解决方案1】:

    如果你只需要在生成的类中添加@XmlType(name = "Foo", namespace = "example.com")注解,你可以使用JAXB Annotate PluginHere 是关于如何在外部绑定文件中定义注释的文档。

    如果你使用 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"/>
    

    【讨论】:

      【解决方案2】:

      注意:我是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>
      

      更多信息

      【讨论】:

      • 使用标准 jaxb 绑定文件的任何方法?
      • 标准 JAXB 绑定文件用于控制如何从 XML 模式生成类。如果我直接了解您的用例,您是从 Java 类开始并想要生成 XML 模式?
      • 是的 - 在我的例子中,CXF 在 WSDL 中生成 XML 模式,我需要一种方法来控制模式。
      猜你喜欢
      • 2010-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-02
      • 2011-06-20
      • 1970-01-01
      • 2011-06-19
      • 1970-01-01
      相关资源
      最近更新 更多