【iDempiere Lab】モデルバリデータのクラスが存在しない場合はログイン時にエラーになる

先日、ある方からログイン時にエラーになる旨の連絡を受けました。

ログイン時のエラー
ログイン時のエラー

上記のエラーは、モデルバリデータのプラグインが見つからないというエラーなのはすぐに分かりました。しかしながら、モデルバリデータのプラグインについては見つからない場合でもエラーにならないように設定していたので、何かシステム的な挙動が変更になっているな・・・と直感的に思いました。

システムウィンドウの「モデルバリデーターのクラスが無い場合はエラーにする」フラグがOFF
システムウィンドウの「モデルバリデーターのクラスが無い場合はエラーにする」フラグがOFF

「システム」ウィンドウにある「モデルバリデーターのクラスが無い場合はエラーにする」フラグをOFFにしておけば、、モデルバリデーターのクラスが見つからない場合でも、これまではエラーにならずにログインすることができていました。

 そのため、このコンテンツではログイン時にモデルバリデータのクラスが見つからなかった場合のシステムとしての振る舞いが変更になった理由を調査及び研究し、その成果をまとめておきたいと思います。

IDEMPIERE-6471: Prevent data corruption if a plugin is missing(必須プラグインの存在チェック機構)

 ログイン時にモデルバリデータのクラスが見つからなかった場合のシステムとしての振る舞いが変更になった理由はすぐに見つかりました。

 JIRAのチケット番号IDEMPIERE-6471:Prevent data corruption if a plugin is missing (必須プラグインの存在チェック機構)が release-12のブランチに2025年4月にコミットされており、この修正によりログイン時にモデルバリデータのクラスが見つからなかった場合のシステムとしての振る舞いが変更になっていました。

 この変更の趣旨としては、おのおのがカスタマイズ開発したプラグインが無い場合に、そのことによってデータの整合性が取れなくなることを防ぐことを目的として、ログイン時にエラーにしているとのことです。

追加されたAD_RequiredPluginテーブル 

このJIRAチケットIDEMPIERE-6471では、AD_RequiredPluginテーブルが追加されており、どうやらこのテーブルにプラグインを登録しておいて、起動時にそのプラグインが見つからないとエラーになる様子です。

AD_RequiredPluginテーブル
AD_RequiredPluginテーブル

Rquired Plugin」というウィンドウも追加されているので確認してみます。

「Rquired Plugin」ウィンドウ
「Rquired Plugin」ウィンドウ

「Plugin Name」フィールドにプラグイン名を登録し、「Execute State」フィールドに実行時のステータスを登録しておけば、そのプラグインが存在しないか、該当するステータスになっていない時にはエラーになる様子ですね。

試しに「jpiere.plugin.generic.export」のプラグインを登録してみたいと思います。1年くらい前に作成した【JPIERE-0628(v11)】汎用エクスポートプロセスのプラグインですね。

「jpiere.plugin.generic.export」のプラグインを登録
「jpiere.plugin.generic.export」のプラグインを登録

保存しようとすると「getPO for UUID constructor not implemented in this model factory class」というエラーが表示されました・・・。

エラー
エラー

このエラー原因は別途調査するとして、この機能に関するWikiがありますので、そのリンクも掲載しておきます。興味のある方はご参照下さい。

Wiki: NF12 Validate Required Plugins

 

【2025/11/29追記】必須プラグインの存在チェック機構のエラーについて

「getPO for UUID constructor not implemented in this model factory class」のエラー表示は、必須プラグインの情報を登録するAD_RequiredPluginテーブルがUUIDを主キーとするテーブルであり、JPiereのプラグインでUUIDからモデルクラスのインスタンスを作成できるように実装していなかったためのエラーでした。JPiereでもUUIDからモデルクラスのインスタンスを作成できるように実装したことにより、エラーが表示されなくなるのを確認しました。

 必須プラグインの存在チェック機構については下記のコンテンツにまとめましたので、ご参照下さい。

今回は、ログイン時にモデルバリデータのクラスが見つからなかった場合のシステムとしての振る舞いが変更になった理由を調査及び研究するのが目的なので、このエラーについてはいったんおいておいて、調査を進めていきたいと思います。^^

JIRAチケットIDEMPIERE-6471で変更になってソースコードを詳細に見て行くと、「システム」ウィンドウにある「モデルバリデーターのクラスが無い場合はエラーにする[IsFailOnMissingModelValidator]」のフラグの判定が削除されているのを発見しました。

ModelValidationEngineクラス
ModelValidationEngineクラス

 そしてあらたに追加されたロジックとして、「System Administrator」職責で、「Super User」か「System」ユーザー以外の場合には、モデルバリデータのクラスが見つからない場合は一律でエラーになるように修正されていました。

 「Super User」か「System」ユーザーで「System Administrator」職責でのログインの場合にエラーにしないのは、無くても問題無いような不要なモデルバリデーターであれば使用しないように設定変更できるようにするためだと思われます。

 これでひとまず、ログイン時にモデルバリデータのクラスが見つからなかった場合のシステムとしての振る舞いが変更になった理由が、自分なりに納得が行く程度には理解することができたので、このコンテンツはここで終わりにしたいと思います。

【補足説明】プラグインはあるのにエラーが起きたら・・・。

プラグインはあるはずなのに、このコンテンツで紹介したログイン時にモデルバリデータが見つからない旨のエラーに遭遇したら、そのプラグインの開始レベル4になっているかどうか確認してみて下さい。モデルバリデータは開始レベルを5以上にすると動作しないことを確認しています。