当我在我的Play控制器类中使用json时!框架,我经历了一些我不知道为什么的事情。
我有两个ajax调用,所以我的控制器类有两个相应的方法,如下所示:
@BodyParser.Of(BodyParser.Json.class)
public static Result categoryAdder() {
....(using json)....
}
然后,
@BodyParser.Of(BodyParser.Json.class)
public static Result pathCalculator() {
MultipartFormData body = request().body().asMultipartFormData();
FilePart filePart = body.getFile("imageFile");
ObjectNode jsonResult = Json.newObject();
....
}
我使用ajaxForm作为jquery的插件,将文件作为multipartFormData传递。
当我在方法@BodyParser.Of(BodyParser.Json.class)
之前放置pathCalculator()
时,此方法在FilePart filePart = body.getFile("imageFile");
上抛出空指针异常。这意味着请求中没有任何文件。但是,当我从方法@BodyParser.Of(BodyParser.Json.class)
中删除pathCalculator()
时,它运行良好。是否需要@BodyParser.Of(BodyParser.Json.class)
?我不知道为什么。奇怪的是,方法categoryAdder()
在放置@BodyParser.Of(BodyParser.Json.class)
期间运作良好。
是否有人知道为什么会出现这种情况?
答案 0 :(得分:1)
当您使用@BodyParser.Of(BodyParser.Json.class)
时,您正在告诉您在HTTP请求正文中验证Content-Type
为application/json
。
如果您在请求正文中传递JSON并使用此类正文解析器,它将验证内容并在无效时抛出相应的HTTP错误。在第一种情况categoryAdder
,因为你在方法中使用/解析JSON它是有意义的,它是完全正确的(添加验证)。
在第二种情况(pathCalculator)中,Content-Type
为multipart/form-data
,并且不需要JSON正文解析器,因为请求正文中没有JSON。
简单地删除正文解析器就可以了,这就是你应该做的。
Content-Type
在jQuery ajax请求中设置。
参考:http://www.playframework.org/documentation/2.0.4/JavaBodyParsers