Controllerのメソッド引数にOptional<ID<User>>のような Generic な独自型を指定したい。- 独自型の変換時に
Validationと連携したい。
- 独自型の変換時に
- Java8 の javac option
-parametersを使用して、Controllerメソッドの引数名からRequest Parameter名やPathParameter名を解決したい。- こちらは Java8 専用機能になるし、また Ninja の思想から若干外れている気もするので Ninja 本体に手を入れるよりは plugin なりで提供できればよいと考えている。
- (optional)
@PathParamや@Paramを毎回明示せずに、annotation が省略された場合、 上記の引数名解決をするような設定を行えるようにしたい。
現状だと、ネストした型引数のArgumentExtractorを作成することができず、
型毎に個別のArgumentExtractorを書くか、Stringかプリミティブ型(もしくはそのラッパー)で受け取る事になる。
そうするとドメインロジックに渡すには大量のボイラープレートが出現する。
ボイラープレートが大量に出てくると、その面倒くささがドメインロジックを侵食し、 ドメインロジックがStringやプリミティブ型主体の型安全性の低いコードになってしまう。
ArgumentClassHolderが 保持している型情報がjava.lang.Class<?>のため、型引数の情報が取れない。ArgumentExtractorが、該当のMethodインスタンスや、何番目の引数なのかの情報にアクセスできない。- ControllerMethodInvoker.build が static メソッドなため、設定で差し替えられない。
ninja.Configurationで定義された binding をカスタマイズできない
(以下が上記を実現する最も適した解ではない可能性はある。よりベターな解決策があるのであればそれでよし)
ArgumentClassHolderが 保持している型情報をjava.lang.reflect.Typeにして欲しい。もしくはTypeを追加して欲しい。ArgumentExtractorを作成する時にjava.lang.reflect.Methodインスタンスと、java.lang.reflect.Parameterインスタンスと何番目の引数なのかの情報も ChildInjector に bind して欲しい。Parameterインスタンス があれば ArgumentClassHolder が Type を持たなくても大丈夫かもしれないParameterは JavaSE8 からでした
ControllerMethodInvoker.buildを static メソッドではなく Factoryクラスに分離して、ninja.Configurationで bind するようにして欲しい。- ユーザが作成する
conf.Moduleでninja.Configurationで定義された binding を上書きしてカスタマイズできるようにして欲しい。
ひとまず ArgumentClassHolder の変更と、ControllerMethodInvokerFactory の作成までやった
https://github.com/gakuzzzz/ninja/commits/feature/customizable_argument_extractor
…… build メソッドなんだから Factory じゃなくて Builder の方がよかったか。あとでリネームしよう