2

如何使控制器的动作方法包含两个不同的bodyparser?例如,

@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

我不认为它遵守约定以允许一种方法来解析两种不同的编码。你基本上想要两个控制器功能合二为一。我认为最好有单独的方法来处理不同的编码,像这样

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");
    }
}

据我所知,没有比这更漂亮的方法了。可能不应该,因为您想将两种不同的方法映射到一个方法上。

于 2012-07-25T12:12:02.813 回答