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

我想在CXF Codegen上添加@XmlRoot批注

贺福
2023-03-14
问题内容

我有一个WSDL文件,其中包含以下条目:

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="urn:CP_Ablakido" xmlns:s0="urn:CP_Ablakido" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <wsdl:types>
    <xsd:schema elementFormDefault="qualified" targetNamespace="urn:CP_Ablakido">
      <xsd:element name="GetList_11" type="s0:InputMapping1"/>
      <xsd:complexType name="InputMapping1">
        <xsd:sequence>
          <xsd:element name="Qualification" type="xsd:string"/>
          <xsd:element name="startRecord" type="xsd:string"/>
          <xsd:element name="maxLimit" type="xsd:string"/>
        </xsd:sequence>
      </xsd:complexType>
      <xsd:element name="GetList_11Response" type="s0:OutputMapping1"/>
      <xsd:complexType name="OutputMapping1">
        <xsd:sequence>
          <xsd:element maxOccurs="unbounded" name="getListValues">
            <xsd:complexType>....

我使用具有以下设置的CXF Codegen插件:

<plugin>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-codegen-plugin</artifactId>
    <executions>
        <execution>
            <id>generate-sources</id>
            <phase>generate-sources</phase>
            <configuration>
                <sourceRoot>${basedir}/target/generated-sources/wsdl2java</sourceRoot>
                <encoding>UTF-8</encoding>
            </configuration>
            <goals>
                <goal>wsdl2java</goal>
            </goals>
        </execution>
    </executions>
</plugin>

生成的Java代码如下所示:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "OutputMapping1", propOrder = {
    "getListValues"
})
public class OutputMapping1 {

    @XmlElement(required = true)
    protected List<OutputMapping1 .GetListValues> getListValues;

至于其他答案,我可以放置绑定文件。因此,我创建了一个包含以下内容的绑定文件:

<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 node="//xsd:element[@name='GetList_11Response']">
            <annox:annotate target="class">
                <annox:annotate annox:class="javax.xml.bind.annotation.XmlRootElement" name="GetList_11Response"/>
          </annox:annotate>
        </jaxb:bindings>
</jaxb:bindings>

并且我在POM.XML中添加了以下代码块:

<wsdlOptions>
    <wsdlOption>
        <wsdl>${basedir}/src/main/resources/wsdl/CP_Ablakido_1.wsdl</wsdl>
        <bindingFiles>                                       
            <bindingFile>${basedir}/src/main/resources/wsdl/CP_Ablakido_1.xjb
            </bindingFile>
        </bindingFiles>
    </wsdlOption>
</wsdlOptions>

之后,我收到错误消息:

com.sun.istack.SAXParseException2; systemId: file:/Project/icp-integration/icpiCameI/src/main/resources/wsdl/CP_Ablakido_1.xjb; lineNumber: 9; columnNumber: 72; XPath evaluation of "//xs:element[@name='GetList_11Response']" results in empty target node
    at com.sun.tools.xjc.reader.internalizer.Internalizer.reportError(Internalizer.java:624)
    at com.sun.tools.xjc.reader.internalizer.Internalizer.reportError(Internalizer.java:618)
    at com.sun.tools.xjc.reader.internalizer.Internalizer.buildTargetNodeMap(Internalizer.java:294)
    at com.sun.tools.xjc.reader.internalizer.Internalizer.buildTargetNodeMap(Internalizer.java:390)
    at com.sun.tools.xjc.reader.internalizer.Internalizer.transform(Internalizer.java:146)

因此,我不知道如何准确地描述当complexType为OutputMapping1时,将@XmlRootElement放在名称为“
GetList_11Response”的OutputMapping1.java中。


问题答案:

我找到了解决方案。这很棘手,因为:

  1. 必须处理WSDL中内联的XSD。(技巧是schemaLocation =“ CP_Ablakido_1.wsdl#types1”。它告诉JAXB使用WSDL文件中的节点。)
  2. 必须配置CXF以使用XJC插件(annox)。

必须将以下片段添加到POM.XML:

<wsdlOption>
    <wsdl>${basedir}/src/main/resources/wsdl/CP_Ablakido_1.wsdl</wsdl>
    <bindingFiles>
        <bindingFile>${basedir}/src/main/resources/wsdl/CP_Ablakido_1.xjb</bindingFile> 
    </bindingFiles>
    <extraargs><extraarg>-xjc-Xannotate</extraarg></extraargs>
</wsdlOption>

和依赖项必须添加到插件:

<dependency>
    <groupId>org.jvnet.jaxb2_commons</groupId>
    <artifactId>jaxb2-basics-annotate</artifactId>
    <version>0.6.0</version>
</dependency>

<dependency>
    <groupId>org.apache.cxf.xjcplugins</groupId>
    <artifactId>cxf-xjc-ts</artifactId>
    <version>3.0.5</version>
</dependency>

XJB文件:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<jaxb:bindings version="2.0" 
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
    jaxb:extensionBindingPrefixes="annox xjc"
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns:annox="http://annox.dev.java.net"
    xmlns:inheritance="http://jaxb2-commons.dev.java.net/basic/inheritance">

  <jaxb:bindings schemaLocation="CP_Ablakido_1.wsdl#types1" node="/xs:schema"> 
       <jaxb:bindings node="//xs:complexType[@name='InputMapping1']">
            <annox:annotate target="class">
                <annox:annotate annox:class="javax.xml.bind.annotation.XmlRootElement" name="GetList_11"/>
          </annox:annotate>
      </jaxb:bindings>    
      <jaxb:bindings node="//xs:complexType[@name='OutputMapping1']">
            <annox:annotate target="class">
                <annox:annotate annox:class="javax.xml.bind.annotation.XmlRootElement" name="GetList_11Response"/>
          </annox:annotate>
      </jaxb:bindings>
   </jaxb:bindings>
</jaxb:bindings>


 类似资料:
  • 我使用带有以下设置的CXF Codegen插件: 生成的java代码如下所示: 问题是这里缺少@XmlRootelement。还有另一个类似的问题 maven-cxf-codegen-plugin,使用Jaxb绑定为所有生成的类添加继承 注释CXF(wsdl2java)生成的包 在外部为类创建jaxb注释 因此,我不知道如何准确地描述当complexType是OutputMapping1时,将@X

  • 问题内容: 我的代码。 我的问题,当表单执行此文件时,我想将这30天添加到数据库的日期列中,然后在fname中插入fname,在web中插入web,并在日期+ 30间隔中插入日期。 谢谢你。 问题答案: 使用以下查询:

  • 所以,最近我开始制作自己的机器人,我也不是最有经验的人,但我知道我在做什么。我打破了基本的不和。在Discord上提供了js索引。js指南,并且只是在其中添加了我自己的代码,而没有实际接触命令处理程序。 对于一些命令,我想有一个烫发水平,只有烫发水平 permlvl 1=管理消息^不是实际的代码只是一个例子,这样只有具有perm级别的用户才能使用它。 这是我的索引。目前: 除了我的另一个客户。和客

  • 这是我要添加的嵌套对象类型:{“user_id”:434,“firstname”:“harry”,“lastname”:“dex”,“username”:“pn1002”,“password”:“reset123”,“role”:{“rolename”:“user”}} 这是我的主文件: 我收到警告: w/system.err:org.json.jsonobject.get(jsonobject.

  • 我使用List来动态存储值,但我必须在二进制搜索程序中输入之前指定List的大小。我需要帮助,因为我不想将大小作为输入。 我曾尝试使用,但这行不通,有人建议我使用 size() 现在我希望用户输入元素,直到他想要,然后使用二进制搜索找到元素的索引

  • 但我需要一个解释,因为代码的工作方式与预期的不同。 我想在我的网站上有一个链接,用户可以点击whatsapp链接,开始与联系人的对话。 我添加的代码是这样的: null 这段代码在Android和iPhone上都可以使用,但它不允许我添加自定义联系号码: abid只能是已保存在您手机中的联系人的ID,否则它将打开whatsapp中的联系人选择页面 请不要在没有内容解释的情况下分享链接,因为我不是一