Asakusa Framework : DMDLのハマりやすいところ

f:id:teppei-studio:20131112202621j:plain

これまで、

Asakusa Frameworkのススメ - TEPPEI STUDIO
Asakusa Framework : はじめの一歩 - TEPPEI STUDIO

と書いてきましたが、ここからはより具体的に各機能について書いていきたいと思います。

今回はDMDLです。DMDL自体に大した機能があるわけではないのですが、私がよくやるミスで、エラーメッセージが分かりにくいものがあるので、それを紹介したいと思います。

※ 全般的にDirectIOでCSVファイルを読み込む場合を想定して書いています。

名前の制約違反をした場合

まずは簡単なところから。

DMDLで定義するデータモデルやプロパティの名前に使える文字の制約は、
DMDLユーザガイド:名前の形式にある通りですが、これに違反すると以下のように出ます。以下は"-"(ハイフン)を誤って利用した場合です。「Was expecting:」でちょっと混乱しますが、まぁ分かるところですね。

     [java] Caused by: com.asakusafw.dmdl.parser.ParseException: Encountered " <UNEXPECTED> "- "" at line 9, column 13.
     [java] Was expecting:
     [java]     ":" ...

【2014/1/4 追記】
0.5.3で改善されました

CSVファイル内のヘッダー名と、プロパティ名に相違がある場合

これが個人的に一番ハマりやすいところです。

DMDLに定義したフィールド名と、読み込むCSVファイルのヘッダーにあるフィールド名が相違している場合、まるでヘッダーがレコード行として読み込まれてしまったかのようなエラーになります。

ERROR report.CommonsLoggingReport: Error occurred
com.asakusafw.runtime.io.csv.CsvFormatException: INVALID_CELL_FORMAT (at {ファイルパス}:1, record=1, column=1, expected=int value, actual={誤ったフィールド名})

intの値だと思ってたら文字列だったぞこの野郎。というメッセージが出力されます。フィールド名の指定の間違いなのに、型の違いのように出力されてしまうので注意です。

これは該当のフィールドがINTとか文字列の型を指定していないから、まだ分かり易い方です。

私が苦戦したのが、前半のフィールドは文字列型、途中から数値型みたいなデータモデルであったため、その数値型のデータモデルのところでエラーが検知されていて、どこのフィールド名が間違っているのか判断するのに手間がかかりました。

最悪なのが、もし、全てのフィールドで文字列型を指定してしまっていると、本当にヘッダーをレコード行として読みこんで処理進めていくので、データ読み込みのタイミングで気づくことができません。

CSVファイルの文字コード相違の場合

DMDLファイルはExcelのフィールド一覧の資料をベースにするためにWindows環境で作る、という場合には、きちんとUTF-8にできていないミスが起き易いですね。Shift_JISになっていたり、UTF-8だけど、BOM付きとかになってしまうと、上記とおなじように、INVALID_CELL_FORMAT エラー になってしまいます。

おしまい

その他、MasterJoinのDMDL定義等でハマり易いところもあるのですが、それはMasterJoinのところで書きたいと思います。

複数の事象が、INVALID_CELL_FORMAT エラーとして丸まってでてしまうので、これが出た時は、文字通り型不正になっていないかだけでなく、フィールド名の相違のなっていないか、ファイルの文字コードが相違していないかも確認すべきですね。