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)放置之前运行良好。

有没有人知道为什么会发生这种情况?

4

1 回答 1

1

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

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

在第二种情况下(pathCalculator),Content-Type不需要multipart/form-dataJSON 正文解析器,因为请求正文中没有 JSON。

只需删除正文解析器即可,这就是您应该做的。

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

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

于 2013-01-25T11:22:30.077 回答