当前位置: 首页 > 面试题库 >

如何使用类自定义解决文件生成冲突

古棋
2023-03-14
问题内容

我正在尝试使用Maven生成Spring框架要使用的JAXB文件,但是Maven显示以下错误:

我了解它无法生成带有名称的文件,但是我不确定如何解决该问题。

org.xml.sax.SAXParseException; systemId: http://www5v80.elsyarres.net/service.asmx?wsdl; lineNumber: 5; columnNumber: 39; A class/interface with the same name "hello.wsdl.SearchFlights" is already in use. Use a class customization to resolve this conflict.
....
org.xml.sax.SAXParseException; systemId: http://www5v80.elsyarres.net/service.asmx?wsdl; lineNumber: 12; columnNumber: 43; (Relevant to above error) another "SearchFlights" is generated from here.
....
org.xml.sax.SAXParseException; systemId: http://www5v80.elsyarres.net/service.asmx?wsdl; lineNumber: 371; columnNumber: 42; A class/interface with the same name "hello.wsdl.GetFlightDetails" is already in use. Use a class customization to resolve this conflict.
....

Maven插件

    <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.4</version>
        <configuration>
            <warSourceDirectory>WebContent</warSourceDirectory>
        </configuration>
    </plugin>
    <plugin>
        <groupId>org.jvnet.jaxb2.maven2</groupId>
        <artifactId>maven-jaxb2-plugin</artifactId>
        <version>0.12.3</version>
        <executions>
            <execution>
                <goals>
                    <goal>generate</goal>
                </goals>
            </execution>
        </executions>
        <configuration>
            <schemaLanguage>WSDL</schemaLanguage>
            <generatePackage>hello.wsdl</generatePackage>
            <schemas>
                <schema>
                    <url>http://www5v80.elsyarres.net/service.asmx?wsdl</url>
                </schema>
            </schemas>
        </configuration>
    </plugin>

我将以下package-info.java文件添加hello.wsdl程序包中,但没有帮助。

@XmlSchema( 
    namespace = "ElsyArres.API",
    elementFormDefault = XmlNsForm.QUALIFIED) 
package hello.wsdl;

import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;

问题答案:

您面临的错误消息基本上表明types您两次使用了wsdl部分中的某些名称。在您的情况下, 所有
<element>标记与其对应的类型(定义为<complexType>)具有相同的名称。

例:

  <s:element name="SearchFlights">
    <s:complexType>
      <s:sequence>
        <s:element minOccurs="0" maxOccurs="1" name="SoapMessage" type="tns:SearchFlights" />
      </s:sequence>
    </s:complexType>
  </s:element>

  <s:complexType name="SearchFlights">
    <s:complexContent mixed="false">
      <s:extension base="tns:SoapMessageBase">
        <s:sequence>
          <s:element minOccurs="0" maxOccurs="1" name="Request" type="tns:SearchFlightsRequest" />
          <s:element minOccurs="0" maxOccurs="1" name="Response" type="tns:SearchFlightsResponse" />
        </s:sequence>
      </s:extension>
    </s:complexContent>
  </s:complexType>

这很不常见。

解决这些问题基本上有两种选择:

使用autoNameResolution

 <plugin>
     <groupId>org.jvnet.jaxb2.maven2</groupId>
     <artifactId>maven-jaxb2-plugin</artifactId>
     <version>0.13.1</version>
     <executions>
         <execution>
             <goals>
                 <goal>generate</goal>
             </goals>
         </execution>
     </executions>
     <configuration>

         <args>
             <arg>-XautoNameResolution</arg>
         </args>

         <schemaLanguage>WSDL</schemaLanguage>
         <generatePackage>hello.wsdl</generatePackage>
         <schemas>
             <schema>
                 <url>http://www5v80.elsyarres.net/service.asmx?wsdl</url>
             </schema>
          </schemas>
      </configuration>
  </plugin>

该插件将通过在每个冲突名称后附加数字来解决所有命名冲突。在上述 SearchFlights 情况下,这将导致 生成 SearchFlights 和_SearchFlights2_ 。

更好的方法 是使用绑定文件提前解决所有名称冲突。绑定文件主要包含XPATH表达式和转换规则。 以下是绑定到 每个 声明名称的绑定文件:

<?xml version="1.0" encoding="UTF-8"?>
<jaxws:bindings wsdlLocation="http://www5v80.elsyarres.net/service.asmx?wsdl"
            xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
            xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
            xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" version="2.1"
            xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <jaxws:bindings node="wsdl:definitions/wsdl:types/xs:schema[@targetNamespace='ElsyArres.API']">
        <jaxb:schemaBindings>
            <jaxb:nameXmlTransform>
                <jaxb:elementName suffix="Elem"/>
            </jaxb:nameXmlTransform>
        </jaxb:schemaBindings>
    </jaxws:bindings>
</jaxws:bindings>

对于jaxb:nameXmlTransform后缀和其他类型的xml元素(如类型),还有其他选项。

可悲的是,我无法使用org.jvnet.jaxb2.maven2:maven-jaxb2-plugin(但我确定有一个有效的配置)来使用此绑定文件。

尽管如此,它仍可用于org.codehaus.mojo:jaxws-maven-plugin和以下配置。

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>jaxws-maven-plugin</artifactId>
    <version>2.4.1</version>
    <executions>
        <execution>
            <goals>
                <goal>wsimport</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <bindingFiles>
         <bindingFile>${basedir}/src/main/resources/bindings.xjb</bindingFile>
        </bindingFiles>
        <wsdlUrls>
            <wsdlUrl>http://www5v80.elsyarres.net/service.asmx?wsdl</wsdlUrl>
        </wsdlUrls>
        <vmArgs>
            <vmArg>-Djavax.xml.accessExternalSchema=all</vmArg>
        </vmArgs>
    </configuration>
</plugin>


 类似资料:
  • 我希望向sbt添加一个自定义源生成器,并将其与scalapb(Scala协议缓冲区生成器)一起使用。每一个都独立工作。然而,当两者结合在一起时,项目在清理后第一次编译失败。如果我再次运行compile,它就会成功。 错误消息: 要再现此错误,您需要在src/main/protobuf中至少有一个proto文件。 我的自定义任务和scalapb这两个源生成器会发生冲突,这让我感到困惑。它们不应该都写

  • 我正在使用Swashback为ASP生成swagger文档。NET核心API我正在写。在我的API中,我使用了许多自定义Json转换器,因此我接收和返回的Json看起来与C类的定义不完全一样。例如,我可能有这样一个类: 它将被序列化为 然而,Swashuckle将其记录为 我如何告诉Swashback我的模型是如何序列化和反序列化的?

  • 我正在尝试rollup js来构建我的typescript项目,但我不知道如何生成定义文件,以及如何将它们自动包含在dist文件中。 有人知道怎么做吗? 这是我的汇总表。配置。js 我使用的是默认的ts配置,但对于declaration=true也是如此。 编辑: 还尝试使用Webpack: Tsconfig: 生成d.ts如下所示: 但是在我使用该包的应用程序中,它找不到生成器... 生成器未定

  • 在我们的项目中,我们正试图从Spring标准AOP转移到AspectJ,正如在许多类似的地方所解释的那样(我们需要使事务处理成为一些私有和受保护的方法)。 我们已经能够使用标准的Spring注释(如)来很好地完成这项工作。但是我们面临的问题是,在我们的项目中,有一些自定义注释(不是自定义方面)是AeyJ无法识别的。例如,我们有一个注释“扩展”(仅修改属性): 你知道如何告诉AspectJ也给wea

  • 问题内容: 实施自己的最佳方法是哪一种? 其实我得到一个问题登记。如果我在中使用自定义类,则管理页面上不会显示任何应用程序。 我用一个小技巧解决了这个问题。我写了这个课: 并像这样实现我的自定义AdminSite: 所以,我可以用这个为。 有人知道更好的方法吗?由于我以下划线开头访问var,所以它不过是hack。我不喜欢黑客。 编辑:另一种方法是重写函数,但是在这种情况下,我将有冗余代码。 问题答

  • 问题内容: 我正在使用JAXB和xjc将XML Schema编译为Java类。我不想手动编辑此生成的类。我有这样的xml模式: xjc生成仅包含对象列表的类。是否有机会省略该类并直接在该类中具有对象列表? 我知道可以通过注释来完成,但是我不知道如何告诉xjc创建此类注释。 感谢您的任何建议! 最好的问候,马库斯 问题答案: Bjarne Hansen为xjc开发了一个插件,可以解决此问题。不幸的是