有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java IllegalAnnotationExceptions:两个类具有相同的XML类型名。由CXF插件生成的代码

我有两个WSDL,我使用maven cxf codegen插件(org.apache.cxf)从中生成Java代码。它们都使用相同的名称空间,并且包含相同名称的复杂类型,这就是我遇到java类名冲突问题的原因。我决定用绑定来解决这个问题。xml:

<jaxws:bindings
        xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
        xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
        xmlns="http://www.w3.org/2001/XMLSchema"
        version="2.1">
    <jaxws:bindings wsdlLocation="./TaskService_v1.wsdl" node="xsd:schema">
        <jaxb:schemaBindings>
            <jaxb:nameXmlTransform>
                <jaxb:typeName prefix="TaskService" />
                <jaxb:elementName prefix="TaskService" />
            </jaxb:nameXmlTransform>
        </jaxb:schemaBindings>
    </jaxws:bindings>
</jaxws:bindings>

例如,它将生成的类B2BPParameter重命名为TaskServiceB2BPParameter,因此我不再遇到名称冲突问题,但我遇到了另一个问题:

Unknown JAXB exception; nested exception is com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 4 counts of IllegalAnnotationExceptions
Two classes have the same XML type name "{http://serviceinterface.b2b.adx.com}B2BParameter". Use @XmlType.name and @XmlType.namespace to assign different names to them.
this problem is related to the following location:
    at com.adx.b2b.serviceinterface.TaskServiceB2BParameter
this problem is related to the following location:
    at com.adx.b2b.serviceinterface.B2BParameter
    at protected java.util.List com.adx.b2b.serviceinterface.B2BRequest.parameter
    at com.adx.b2b.serviceinterface.B2BRequest
...

这是生成的TaskServiceB2B参数。爪哇:

package com.axd.b2b.serviceinterface_v1;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "B2BParameter", propOrder = {
    "name",
    "value"
})
public class TaskServiceB2BParameter {
    ...
}

如何更新我的绑定。xml来更改@XmlType。恰当地命名?还是我真的需要改变目标套餐? 提前谢谢


共 (1) 个答案

  1. # 1 楼答案

    问题是单个封送拆收器发现了具有相同元素名称的类。我这样解决了这个问题:

    1)将类生成到不同的包中

            <plugin>
                <groupId>org.apache.cxf</groupId>
                <artifactId>cxf-codegen-plugin</artifactId>
                <version>3.3.3</version>
                <executions>
                    <execution>
                        <id>generate-sources</id>
                        <phase>generate-sources</phase>
                        <configuration>
                            <sourceRoot>${project.build.directory}/generated-sources/cxf</sourceRoot>
                            <wsdlOptions>
                                <wsdlOption>
                                    <wsdl>${basedir}/src/main/resources/META-INF/wsdl/Service1.xml</wsdl>
                                    <packagenames>
                                        <packagename>com.xxx.service1</packagename>
                                    </packagenames>
                                </wsdlOption>
                                <wsdlOption>
                                    <wsdl>${basedir}/src/main/resources/META-INF/wsdl/Service2.xml</wsdl>
                                    <packagenames>
                                        <packagename>com.xxx.service2</packagename>
                                    </packagenames>
                                </wsdlOption>
                            </wsdlOptions>
                        </configuration>
                        <goals>
                            <goal>wsdl2java</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
    

    2)为每个服务创建特殊的marshaller bean

    @Configuration
    public class WebServiceConfig {
    
    @Bean
    public Jaxb2Marshaller service1Marshaller() {
        Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
        marshaller.setPackagesToScan("com.xxx.service1");
        return marshaller;
    }
    
    @Bean
    public Jaxb2Marshaller service2Marshaller() {
        Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
        marshaller.setPackagesToScan("com.xxx.service2");
        return marshaller;
    }
    }