7

次のエントリを含む 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;

問題は、ここに @XmlRootElement がないことです。のような別の同様の質問がありました

  1. 生成されたすべてのクラスの継承を追加するために Jaxb バインディングを使用する maven-cxf-codegen-plugin
  2. CXF (wsdl2java) で生成されたパッケージに注釈を付ける
  3. クラスの jaxb アノテーションを外部で作成する

他の回答が述べたように、バインディングファイルを配置できます。そこで、次の内容のバインディング ファイルを作成しました。

<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 を OutputMapping1.java に "GetList_11Response" という名前で配置することをどのように正確に記述できるかわかりません。

4

2 に答える 2

9

解決策を見つけました。次の理由から、それはトリッキーでした。

  1. XSD が WSDL でインライン化されていることを処理する必要があります。(トリックは schemaLocation="CP_Ablakido_1.wsdl#types1" です。WSDL ファイルでノードを使用することを JAXB に伝えます。)
  2. XJC プラグイン (annox) を使用するには、CXF を構成する必要があります。

次のフラグメントを 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>
于 2015-12-12T15:43:35.027 に答える
0

@du-it 私が理解しているように、すべてのクラスに XmlRootElement を自動的に適用する必要はありません。これが理由です: https://community.oracle.com/blogs/kohsuke/2006/03/03/why-does-jaxb-put-xmlrootelement-sometimes-not-always したがって、タイプごとに別々に行うことは、それを行う適切な方法。

于 2018-11-28T12:02:39.810 に答える