2

2つの異なるボディパーサーを含むコントローラーのアクションメソッドを作成するにはどうすればよいですか?例えば、

@BodyParser.Of(BodyParser.Json.class)
@BodyParser.Of(BodyParser.FormUrlEncoded.class)
public static Result register() {

    RequestBody body = request().body();
    JsonNode node = body.asJson();
    Map<String, String[]> map = body.asFormUrlEncoded();

    if(node != null) {
        return ok("Got: " + node);
    } else if (map != null) {
        return ok("Got: " + map);
    } else {
        return badRequest("Expecting application/json request body");
    }
}
4

1 に答える 1

2

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つのメソッドにマップする必要があるため、おそらく存在しないはずです。

于 2012-07-25T12:12:02.813 に答える