Skip to content

Instantly share code, notes, and snippets.

@gakuzzzz
Last active August 29, 2015 13:57
Show Gist options
  • Save gakuzzzz/9737634 to your computer and use it in GitHub Desktop.
Save gakuzzzz/9737634 to your computer and use it in GitHub Desktop.
Ninja Framework お悩み相談

Ninja Framework 困りごと

やりたい事

  1. Controller のメソッド引数に Optional<ID<User>> のような Generic な独自型を指定したい。
    • 独自型の変換時に Validation と連携したい。
  2. Java8 の javac option -parameters を使用して、 Controllerメソッドの引数名からRequest Parameter名やPathParameter名を解決したい。
    • こちらは Java8 専用機能になるし、また Ninja の思想から若干外れている気もするので Ninja 本体に手を入れるよりは plugin なりで提供できればよいと考えている。
  3. (optional) @PathParam@Param を毎回明示せずに、annotation が省略された場合、 上記の引数名解決をするような設定を行えるようにしたい。

なぜこの機能が必要か

現状だと、ネストした型引数のArgumentExtractorを作成することができず、 型毎に個別のArgumentExtractorを書くか、Stringかプリミティブ型(もしくはそのラッパー)で受け取る事になる。 そうするとドメインロジックに渡すには大量のボイラープレートが出現する。

ボイラープレートが大量に出てくると、その面倒くささがドメインロジックを侵食し、 ドメインロジックがStringやプリミティブ型主体の型安全性の低いコードになってしまう。

困っている事

  1. ArgumentClassHolder が 保持している型情報が java.lang.Class<?> のため、型引数の情報が取れない。
  2. ArgumentExtractor が、該当の Method インスタンスや、何番目の引数なのかの情報にアクセスできない。
  3. ControllerMethodInvoker.build が static メソッドなため、設定で差し替えられない。
  4. ninja.Configuration で定義された binding をカスタマイズできない

して欲しい事

(以下が上記を実現する最も適した解ではない可能性はある。よりベターな解決策があるのであればそれでよし)

  1. ArgumentClassHolder が 保持している型情報を java.lang.reflect.Type にして欲しい。もしくは Type を追加して欲しい。
  2. ArgumentExtractor を作成する時java.lang.reflect.Methodインスタンスと、java.lang.reflect.Parameterインスタンスと 何番目の引数なのかの情報も ChildInjector に bind して欲しい。
    • Parameterインスタンス があれば ArgumentClassHolder が Type を持たなくても大丈夫かもしれない
    • Parameter は JavaSE8 からでした
  3. ControllerMethodInvoker.build を static メソッドではなく Factoryクラスに分離して、ninja.Configuration で bind するようにして欲しい。
  4. ユーザが作成する conf.Moduleninja.Configuration で定義された binding を上書きしてカスタマイズできるようにして欲しい。
@gakuzzzz
Copy link
Author

ひとまず ArgumentClassHolder の変更と、ControllerMethodInvokerFactory の作成までやった
https://github.com/gakuzzzz/ninja/commits/feature/customizable_argument_extractor

…… build メソッドなんだから Factory じゃなくて Builder の方がよかったか。あとでリネームしよう

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment