play2.4からplay2.6にMigration中
既存アプリケーションでは「Java Http Request Handlers - 2.4.x」の要領で、play.http.HttpRequestHandler
のcreateAction
をOverrideしてすべてのリクエストをフックして、リクエストのログ出力等を行っています。
Play2.6
にMigrationしたところこの部分でコンパイルエラーが発生しました。
HttpRequestHandler
からcreateAction
がなくなって、Implements対象はhandlerForRequest
となっています。ところが、handlerForRequestのパラメタは以下の通りRequest
でなくRequestHeader
となっていて必要な情報(例えばAjax/POSTリクエストのbody)が取得できません。
@Override
public HandlerForRequest handlerForRequest(RequestHeader header)
困惑していたらcreateAction
はplay.http.ActionCreator
というクラスに定義が移動しているようで、これをImplements
してみました。
変更点は、廃止されたPlay独自定義のPromise
をJava標準のCompletionStage
に置きかえるだけです。(logRequestやupdateMenuItemは独自定義メソッドです)
@Override
public Action createAction(Request request, Method method) {
logRequest(request, method);
try {
return new Action.Simple() {
@Override
public Promise<Result> call(Http.Context context) throws Throwable {
updateMenuItem(request, context);
return delegate.call(context);
}
};
} finally {
}
}
@Override
public Action createAction(Request request, Method method) {
logRequest(request, method);
try {
return new Action.Simple() {
@Override
public CompletionStage<Result> call(Http.Context context) {
updateMenuItem(request, context);
return delegate.call(context);
}
};
} finally {
}
}
これでOKかと思って、アプリケーションを実行したら以下のエラーが発生しました。
Cannot load play.http.requestHandler
play.http.requestHandler [class java.lang.Class}] does not implement interface
play.api.http.HttpRequestHandler or interface play.http.HttpRequestHandler.
色々と調べてみたところ、application.conf
で当該クラスを紐付ける対象を変更して解決。
これで既存と同じ動きを実現できました。
前)play.http.requestHandler
= "com.nyango.xxx.xxx.xxx.httpRequestHadler"
後)play.http.actionCreator
= "com.nyango.xxx.xxx.xxx.httpRequestHadler"
公式のMigration手順にも記載されておらず、そこそこ時間を要しました。
参考になれば幸いです。