当前位置: 首页 > 知识库问答 >
问题:

如何更新生成存根的XML-TYPE

郑茂勋
2023-03-14

我成功地从多个wsdlendpoint使用maven-jaxb2-plugin生成java类。

这是一次执行:

                <execution>
                    <id>generateDelta</id>
                    <goals>
                        <goal>generate</goal>
                    </goals>
                    <configuration>
                        <schemaLanguage>WSDL</schemaLanguage>
                        <generatePackage>com.somepackage1</generatePackage>
                        <schemas>
                            <schema>
                                <url>
                                    wsdl_url
                                </url>
                            </schema>
                        </schemas>
                    </configuration>
                </execution>

这里的问题是,我有多个执行,因此生成多个类,每个执行将类保存在不同的包中。

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Bapiret2", propOrder = {...})

一个B类abiret2.java在多个包中生成(因此,它来自多个wdsls)

当我执行使用这个存根的代码时,例如在单元测试中,我会得到以下异常:

    org.springframework.oxm.UncategorizedMappingException: Unknown JAXB exception; nested exception is com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions
Two classes have the same XML type name "{urn:sap-com:document:sap:soap:functions:mc-style}Bapiret2". Use @XmlType.name and @XmlType.namespace to assign different names to them.
    this problem is related to the following location:
        at com.somepackage1.Bapiret2
    this problem is related to the following location:
        at com.somepackage2.Bapiret2

我发现了一些可能的修复方法,比如在args标记下添加配置

-XautoNameResolution

Arg,它不起作用

我测试了更改XmlType名称属性是否有效,并且确实有效。还可以向XmlType添加命名空间。

问题是我不知道如何添加这个与maven时生成的类

共有2个答案

蒋健
2023-03-14

当来自不同包但具有相同名称空间的两个类都为JAXBContext所知时,您的问题属于JAXBContext。因此,您需要考虑以下几点:

  1. JAXBContext创建是否在您的手中?如果是这样,你真的需要在同一个JAXBContext中的两个类吗?也许你可以为每个用例使用两种不同的上下文?我的意思是当Bapiret2使用Somepackage1Somepackage2时。

如果不可能:

这两个类Bapiret2是从同一个XSD模式生成的,并且实际结构是相同的吗?

如果是-您可能需要重新考虑您生成的包结构。

您只能为所有wsdl生成一个Bapiret2类。有很多方法可以做到这一点,通常是通过向底层XJC编译器添加额外的映射参数,如

  -p {namespace}={package Name}

只是检查插件留档如何做到这一点...(注意:有一个副作用:在包中将只有类从上次插件执行。

在这种情况下,我使用上面的第一个解决方案——不同的JAXBContext

但无论如何,下面有一些解决方案。(我从未尝试过,但人们似乎对此很满意:-)

获取jaxb异常就像两个类具有相同的xml类型名一样

extending-jaxb-representing-annotations.html

PS.手动(或通过一些脚本)更改后生成仍然是选项...

谷德本
2023-03-14

对于每个wsdl url,在configuration元素内部,您应该指定schemaDirectory和generatePackage元素,它们应该指向不同于其他元素的名称,因为schemaDirectory会产生一个副作用,即清除指定的目录。

 类似资料:
  • 问题内容: 我正在尝试使用jaxb生成xml。我创建了xsd并生成了Java类。但是,当我生成xml时,我会将ns2前缀添加到根标签中,这是我不想要的。 例如:我想成为根标签 ,但成为 在生成的java类中,我给了注解 可以帮个忙吗 问题答案: 如果这是您的课程: 然后就可以知道根元素上有一个前缀,因为您已指定“根”元素是名称空间限定的,而“ id”元素则不是。 如果将package-info类添

  • 问题内容: 我有一个兼容ejb-3的ejb,例如 我需要为此EJB生成存根。但我不想使用Websphere工具或Maven工具。有什么方法可以使用jdk生成存根吗? 创建远程客户端时 可以在weblogic或jboss中工作,但是在websphere中,即使是ejb 3,您也需要这样编写 在这种情况下,如果客户端不存在存根,它将抛出异常,这是一种使用Websphere ejb存根生成器工具生成存根

  • 问题内容: 我正在开发一个Web服务,它需要传递一个新值作为对该服务内方法的引用。 我不熟悉或,但是需要类似的东西(因此创建一个新对象,据我了解返回)。 有任何想法吗? 问题答案: 您可以尝试以下方法: 资源 -

  • 我正在使用certifi python模块来验证ssl连接。我查看了certifi(Python2.7/site-packages/certifi/cacert.pem)中包含的根证书,其中一些证书已经过期。如何更新这些证书?我尝试使用pip更新certifi包,但它只更新包,而不更新根CA文件。

  • Spring RestDocs可用于为具有Spring MockMvc或RestEasy的HTTP API生成文档(例如,asciidoctor格式)。在生成API文档的同时,还可以使用Spring Cloud Contract WireMock生成WireMock存根。只需编写正常的RestDocs测试用例,并使用@AutoConfigureRestDocs在restdocs输出目录中自动存储存

  • 我正在使用xml/映射库,下面是生成xml的方法: 结果和我想要的有点不同。它生成带有小写字母的XML标记: 但是我需要标签以大写字母开头: 我如何用大写字母强制生成?