【Axis】WSDL の Enum を、Javaファイルとして出力するには...

概要

 Axis2 1.6では、Enumをサポートされていないらしい。(以下を参照)
https://issues.apache.org/jira/browse/AXIS2-3967
 Axis2 1.7.0 からサポートらしいが、2013/10/17現在では、まだリリースされていない。
http://shameerarathnayaka.blogspot.jp/2011/09/introducing-enum-support-with-apache.html
では、どうしようか?

解決案1

 * リリース前の「Axis2 trunk」を落として、使用する 
http://shameerarathnayaka.blogspot.jp/search/label/Axis2

必要なもの

 * SVNhttp://svn.apache.org/repos/asf/axis/axis2/java/core/trunk/ でソースを取得する)
 * Maven

なお、上記の設定は、下記の関連記事を参照のこと

関連記事

* Mavan
http://blogs.yahoo.co.jp/dk521123/6775203.html

結果

 * Mavan を設定してやってみたが、エラーが出る...

参考文献

http://axis.apache.org/axis2/java/core/svn.html
http://shameerarathnayaka.blogspot.jp/2011/09/apache-axis2-server-developer-guide-to.html

解決案2

 * Axis1 を使用する

ダウンロード先

 * 例えば、Axis1.4の場合、「axis-1_4.zip」をダウンロードし、解凍する
http://axis.apache.org/axis/java/releases.html

生成手順

 [1] コマンドプロンプトを開き、「axis-1_4\lib」まで移動する

 例えば、Axis1.4で、解凍先が、「C:\pg」の場合
  ------
 cd C:\pg\axis-1_4\lib
  ------

 [2] 「java org.apache.axis.wsdl.WSDL2Java」を使用して、WSDL2ファイルから、Javaファイルを生成する

  ------
 java -cp "C:\pg\axis-1_4\lib\*" org.apache.axis.wsdl.WSDL2Java -o out C:\pg\axis-1_4\lib\sample.wsdl
  ------

 ※WSDL2Javaについては、以下を参照のこと
 ※エラーについては、以下【トラブルシューティング】を参照のこと
http://axis.apache.org/axis/ja/java/reference.html#WSDL2JavaReference

出力例

「C:\pg\axis-1_4\lib\out\com\xxxx\samples\sampleEnumTypes」配下に「Color.java」ができる

Color.java

/**
 * Color.java
 *
 * このファイルはWSDLから自動生成されました / [en]-(This file was auto-generated from WSDL)
 * Apache Axis 1.4 Apr 22, 2006 (06:55:48 PDT) WSDL2Java生成器によって / [en]-(by the Apache Axis 1.4 Apr 22, 2006 (06:55:48 PDT) WSDL2Java emitter.)
 */

package com.xxxx.samples.sampleEnumTypes;

public class Color implements java.io.Serializable {
    private java.lang.String _value_;
    private static java.util.HashMap _table_ = new java.util.HashMap();

    // コンストラクタ / [en]-(Constructor)
    protected Color(java.lang.String value) {
        _value_ = value;
        _table_.put(_value_,this);
    }

    public static final java.lang.String _Black = "Black";
    public static final java.lang.String _White = "White";
    public static final Color Black = new Color(_Black);
    public static final Color White = new Color(_White);
    public java.lang.String getValue() { return _value_;}
    public static Color fromValue(java.lang.String value)
          throws java.lang.IllegalArgumentException {
        Color enumeration = (Color)
            _table_.get(value);
        if (enumeration==null) throw new java.lang.IllegalArgumentException();
        return enumeration;
    }
    public static Color fromString(java.lang.String value)
          throws java.lang.IllegalArgumentException {
        return fromValue(value);
    }
    public boolean equals(java.lang.Object obj) {return (obj == this);}
    public int hashCode() { return toString().hashCode();}
    public java.lang.String toString() { return _value_;}
    public java.lang.Object readResolve() throws java.io.ObjectStreamException { return fromValue(_value_);}
    public static org.apache.axis.encoding.Serializer getSerializer(
           java.lang.String mechType, 
           java.lang.Class _javaType,  
           javax.xml.namespace.QName _xmlType) {
        return 
          new org.apache.axis.encoding.ser.EnumSerializer(
            _javaType, _xmlType);
    }
    public static org.apache.axis.encoding.Deserializer getDeserializer(
           java.lang.String mechType, 
           java.lang.Class _javaType,  
           javax.xml.namespace.QName _xmlType) {
        return 
          new org.apache.axis.encoding.ser.EnumDeserializer(
            _javaType, _xmlType);
    }
    // メタデータ型 / [en]-(Type metadata)
    private static org.apache.axis.description.TypeDesc typeDesc =
        new org.apache.axis.description.TypeDesc(Color.class);

    static {
        typeDesc.setXmlType(new javax.xml.namespace.QName("http://xxxx.com/samples/sampleEnumTypes", "Color"));
    }
    /**
     * メタデータオブジェクトの型を返却 / [en]-(Return type metadata object)
     */
    public static org.apache.axis.description.TypeDesc getTypeDesc() {
        return typeDesc;
    }

}

感想

 * enum ではなく、class として出力されるのが。。。
 (これなら、Axis2でもできるかも)

サンプル

WSDLファイル

sample.wsdl

<definitions name="Sample" targetNamespace="http://example.com/sample.wsdl" xmlns:tns="http://example.com/sample.wsdl" xmlns:xsd="http://example.com/sample.xsd" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns="">http://schemas.xmlsoap.org/wsdl/">
  <schema targetNamespace="http://xxxx.com/samples/sampleEnumTypes" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.0">
    <simpleType name="Color">
      <annotation>
        <appinfo>
          <jaxb:typesafeEnumClass />
        </appinfo>
      </annotation>
      <restriction base="string">
        <enumeration value="Black" />
        <enumeration value="White" />
      </restriction>
    </simpleType>
  </schema>
</definitions>

トラブルシューティング

生成手順[2]でエラーが発生する

生成手順[2]を行った際に、以下のエラーが表示されてしまう。

エラー内容

Error: Could not find or load main class axis.jar

原因

 * WinOSが64BitでJavaJDK)も、64Bitであったため

解決策

 * JavaJDK)を、32Bit版をインストールして試す