1つのメソッドで2つの異なるエンコーディングを解析できるようにするという規則に準拠しているとは思いません。基本的に、1つに2つのコントローラー機能が必要です。このように異なるエンコーディングを処理する別のメソッドを用意するのが最善だと思います。
private static void sharedApplicationLogic() { }
public static Result registerJSON() {
JsonNode node = request().body().asJson();
// Parse
sharedApplicationLogic();
}
public static Result registerFD() {
Map<String,String[]> formdata = request().body().asFormUrlEncoded()
// Parse
sharedApplicationLogic();
}
次に、ルートファイルでこれらのコントローラーメソッドを区別できます。
POST /register.json controllers.Application.registerJSON()
POST /register.formdata controllers.Application.registerFD()
(これはかなりRESTfulnessではありませんが、あなたは考えを理解します)
または、これを決定することにより、コントローラー機能にあります。これはかなり醜いですが、あなたが探している答えだと思います。秘訣は@BodyParser
注釈を省略することです:
public static Result register() {
RequestBody body = request().body();
JsonNode node = body.asJson();
Map<String, String[]> map = body.asFormUrlEncoded();
if(node != null) {
return registerJSON(node);
} else if (map != null) {
return registerFD(map);
} else {
return badRequest("Expecting application/json request body");
}
}
私の知る限り、これを行うためのより良い方法はありません。2つの異なるメソッドを1つのメソッドにマップする必要があるため、おそらく存在しないはずです。