如何使控制器的动作方法包含两个不同的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");
}
}
答案 0 :(得分: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()
(这不是很好的RESTful,但你明白了)
或通过确定这是在控制器功能中。我觉得这很难看,但我想这就是你要找的答案。诀窍是省略@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");
}
}
据我所知,没有更好的方法可以做到这一点。可能不应该,因为你想将两种不同的方法映射到一个方法上。