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 の方がよかったか。あとでリネームしよう