在Play框架的控制器类中使用Json

时间:2013-01-25 01:34:04

标签: json jquery playframework-2.0

当我在我的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)期间运作良好。

是否有人知道为什么会出现这种情况?

1 个答案:

答案 0 :(得分:1)

当您使用@BodyParser.Of(BodyParser.Json.class)时,您正在告诉您在HTTP请求正文中验证Content-Typeapplication/json

如果您在请求正文中传递JSON并使用此类正文解析器,它将验证内容并在无效时抛出相应的HTTP错误。在第一种情况categoryAdder,因为你在方法中使用/解析JSON它是有意义的,它是完全正确的(添加验证)。

在第二种情况(pathCalculator)中,Content-Typemultipart/form-data,并且不需要JSON正文解析器,因为请求正文中没有JSON。

简单地删除正文解析器就可以了,这就是你应该做的。

Content-Type在jQuery ajax请求中设置。

参考:http://www.playframework.org/documentation/2.0.4/JavaBodyParsers