首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JAXB2基本插件- schemaLocation在我的外部绑定自定义文件中的问题

JAXB2基本插件- schemaLocation在我的外部绑定自定义文件中的问题
EN

Stack Overflow用户
提问于 2016-08-15 21:32:16
回答 1查看 1.2K关注 0票数 2

我使用JAXB从我的XSD文件生成类。我希望生成的类实现一个公共接口。因此,我正在试用JAXB2 Basics插件和外部绑定文件方法来实现这一点。这是我的自定义绑定文件:

customBindingFile.xjb

代码语言:javascript
复制
<?xml version="1.0"?>
<jxb:bindings version="1.0" 
  xmlns:jxb="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:inheritance="http://jaxb2-commons.dev.java.net/basic/inheritance"
  jxb:extensionBindingPrefixes="xjc">

    <jxb:bindings schemaLocation="abc-api.xsd">
      <jxb:bindings node="//xs:complexType[@name='MyClass']">
        <inheritance:implements>com.kuldeep.CommonInterface</inheritance:implements> 
      </jxb:bindings>
    </jxb:bindings>
</jxb:bindings>

下面是我在pom文件中用于源生成的maven插件:注意,由me添加的注释是我对现有插件条目所做的更改。

pom.xml

代码语言:javascript
复制
<plugin>
  <groupId>org.apache.cxf</groupId>
  <artifactId>cxf-codegen-plugin</artifactId>
  <version>${cxf.plugin.version}</version>
  <executions>
    <execution>
      <id>generate-sources</id>
      <phase>generate-sources</phase>
      <configuration>

      <!-- **extensions and args added by me** -->
        <extensions>
            <extension>org.jvnet.jaxb2_commons:jaxb2-basics:0.9.2</extension>
        </extensions>
        <args>
            <arg>-Xinheritance</arg>
        </args>


        <sourceRoot>${project.build.directory}/generated/cxf</sourceRoot>
        <defaultOptions>
          <bindingFiles>
            <bindingFile>src/main/resources/jaxws_binding.xml</bindingFile>
            <bindingFile>src/main/resources/jaxb_binding.xml</bindingFile>
          </bindingFiles>
        </defaultOptions>
        <wsdlOptions>
          ......
          <wsdlOption>
            <wsdl>${project.build.directory}/generated/framework/cxf/abc-api-inline.wsdl</wsdl>

            <!-- **bindingFile added by me** -->
            <bindingFile>src/main/resources/customBindingFile.xjb</bindingFile>

          </wsdlOption>
        </wsdlOptions>
      </configuration>
      <goals>
        <goal>wsdl2java</goal>
      </goals>
    </execution>
  </executions>

  <!-- **dependency added by me** -->
  <dependencies>
    <dependency>
      <groupId>org.jvnet.jaxb2_commons</groupId>
      <artifactId>jaxb2-basics</artifactId>
      <version>0.9.2</version>
    </dependency>
  </dependencies>

</plugin>

我遇到的问题是我的模式文件abc api.xsd驻留在其他项目中,所以当我尝试执行maven安装来生成类时,我会遇到错误,说abc api.xsd不是这个编译的一部分。

错误未能在项目上执行目标org.apache.cxf:cxf-codegen-plugin:3.0.3:wsdl2java (Generate):执行生成-目标org.apache.cxf:cxf-codegen-plugin:3.0.3:wsdl2java的源失败: file:/I:/project/src/main/resources/customBindingFile.xjb 9,56:"file:/I:/project/src/main/resources/abc-api.xsd“不是此编译的一部分。这是"file:/I:/project/src/main/resources/jaxb_binding.xml"?-> Help 1的错误吗?

如果我从schemaLocation中删除customBindingFile.xjb属性,它就不能工作,并会产生错误:

对“//xs:复合类型@name=‘MyClass’”的XPath计算会导致空目标节点

因此,我的问题是,如何避免在customBindingFile.xjb中提供特定的模式文件名/位置,并将其应用于任何用于生成类的xsd。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-16 19:43:16

在建筑师的帮助下,我解决了这个问题。我添加了一个jaxws绑定文件,并在其中使用无前缀的xpath查询来匹配我的请求元素。这样,我不需要在任何地方提供模式位置,它将应用于基于XPath查询的特定WSDL。

jaxws_binding_inheritance.xml

代码语言:javascript
复制
<jaxws:bindings version="2.0" xmlns:jaxws="http://java.sun.com/xml/ns/jaxws" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
  xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
  xmlns:inheritance="http://jaxb2-commons.dev.java.net/basic/inheritance" jaxb:extensionBindingPrefixes="inheritance xjc"
  xmlns:jxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.1">

  <jaxws:enableWrapperStyle>false</jaxws:enableWrapperStyle>

  <jaxws:bindings
    node="*[local-name()='definitions']/*[local-name()='types']/*[local-name()='schema' and 
          (@targetNamespace='urn:net:mycompany:api:abc')]">

    <jaxb:bindings
      node="//*[local-name()='element' and 
            not(@name = 'ExcludeThisRequest' or @name = 'AlsoExcludeThisRequest') and 
            (substring(@name, string-length(@name) - string-length('Request') +1) = 'Request')]/*[local-name()='complexType']">
      <inheritance:implements>com.kuldeep.CommonRequest</inheritance:implements>
    </jaxb:bindings>

  </jaxws:bindings>
</jaxws:bindings>

并添加了wsdloption下的jaxws绑定文件(jaxws binding,wsdloption),我想在其中应用该文件。

pom.xml

代码语言:javascript
复制
<wsdlOption>
  <wsdl>${project.build.directory}/generated/framework/cxf/abc-api-inline.wsdl</wsdl>
  <bindingFiles>
    <bindingFile>src/main/resources/jaxws_binding_inheritance.xml</bindingFile>
  </bindingFiles>
</wsdlOption>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38963390

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档