intra-martでテナント環境のセットアップ時にエラーが出たときの話

今回は検証用のテナント環境を構築する時に出会ったメッセージコード「E.IWP.CONTEXT.WEB.10001」のお話です。
見る限り、公式サイトにも載っていなかったので、少しでも調査のお役に立てれば幸いです。


検証環境
----
- Windows10
- intra-mart Accel Platform 2020 spring
- resin 4.0.64
- im-juggling 1.0.20200401　※リポジトリアップデート済み
- PostgreSQL 9.3 



参考サイト
----
- [セットアップガイド　テナント情報][1]
- [IntramartDialectAutoSelector が NullPointerException（個人サイト）][2]

[1]:https://www.intra-mart.jp/document/library/iap/public/setup/iap_setup_guide/texts/tenant/setup_to_tenant_info.html
[2]:http://09.hatenadiary.jp/entry/2016/04/15/070000



エラーが起きるタイミング
----

テナント設定を一通り追えて、最終ステップで登録ボタンを押下後に起こります。

![servererror.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263785/ac0c1683-959d-7a87-1eb4-2f38d4269279.jpeg)


resinのログ（一部抜粋）

```
ERROR] j.c.i.s.c.w.i.ContextFilter - [E.IWP.CONTEXT.WEB.10001] Failed to start the context lifecycle.
java.lang.NullPointerException: null
        at jp.co.intra_mart.mirage.ext.dialect.IntramartDialectAutoSelector.getDialect(IntramartDialectAutoSelector.java:25)
        at jp.co.intra_mart.mirage.ext.dialect.IntramartDialectAutoSelector.getTenantDatabaseDialect(IntramartDialectAutoSelector.java:13)
        at jp.co.intra_mart.mirage.ext.session.IntramartDatabaseManagerSession.getTenantDatabaseSqlManager(IntramartDatabaseManagerSession.java:174)
        at jp.co.intra_mart.mirage.ext.dao.DAOFactory.getTenantDatabaseDAO(DAOFactory.java:96)
        at jp.co.intra_mart.system.service.provider.updater.TenantSetupInformationDelegateImpl.getTenantImUpdateSchemaDAO(TenantSetupInformationDelegateImpl.java:586)
        at jp.co.intra_mart.system.service.provider.updater.TenantSetupInformationDelegateImpl.existTable(TenantSetupInformationDelegateImpl.java:454)
        at jp.co.intra_mart.system.service.provider.updater.TenantSetupInformationDelegateImpl.getUpdatedSchemaVersion(TenantSetupInformationDelegateImpl.java:598)
        at jp.co.intra_mart.system.service.provider.updater.TenantSetupInformationDelegateImpl.getDeployedSchemaVersion(TenantSetupInformationDelegateImpl.java:488)
        at jp.co.intra_mart.system.service.provider.updater.TenantSetupInformationDelegateImpl.completedSetup(TenantSetupInformationDelegateImpl.java:445)
        at jp.co.intra_mart.system.service.provider.updater.TenantSetupInformationDelegateImpl.needSetup(TenantSetupInformationDelegateImpl.java:364)
        at jp.co.intra_mart.system.service.provider.updater.TenantSetupInformation.needSetup(TenantSetupInformation.java:76)
        at jp.co.intra_mart.system.authz.context.impl.StandardAuthzSubjectContextBuilder.needSetup(StandardAuthzSubjectContextBuilder.java:171)
        at ～省略～
```

原因
----
他のタイミングでも出るのかも分かりませんが、私の場合は

-  data-source-mapping-config.xmlをデフォルト状態で使用する。
-  テナント情報画面でdefault以外を選択。
-  テナント環境情報画面#リソース参照を誤って空欄で進めた。

が原因のようでした。

```xml:data-source-mapping-config.xml
  <tenant-data-source>
    <tenant-id>default</tenant-id>
    <resource-ref-name>java:comp/env/jdbc/default</resource-ref-name>
  </tenant-data-source>
```


![tenant_info.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263785/f0c7bacc-be4e-85b9-e1fc-a264bce33fe0.jpeg)

![tenant_env.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263785/9a8e7d45-267d-7525-d229-6c7d0065475e.jpeg)



解決策
----
1.検証目的などで、こだわりが無いのであればテナントIDは「default」を設定する。
2.data-source-mapping-config.xmlに対して任意のテナントID情報を追記する。

あとは、data-source-mapping-config.xmlに記載の無いテナントIDを使っても、リソース参照名を設定することで内部サーバーエラーは出ずにセットアップを完了させることが出来るようです。


おわりに
----
今回、とても単純な入力ミスだったのですが、その割に調査に時間が掛かってしまいました。
入力ミスで起きるExceptionはハンドリングして画面上にエラーメッセージを出しても良いかなと感じました。


今回も短いですが、以上です。