我是Play Framework的新手,但我没有看到任何关于如何处理这个问题的文档。基本上我有一个表单将文本文件上传到服务器,这是相关的片段:
#{form @Sprockets.upload() , enctype:'multipart/form-data' }
<input type="file" name="sprocketFile" size="chars" />
<input type="submit" value="Submit Sprocket" />
#{/form}
在控制器端,这是上传方法:
public static void upload(File sprocketFile) {
}
我的问题是,如果用户不打扰填写表单并只点击“提交链接”,Play会尝试将表单数据转换为文件时自动生成NPE。我该如何解决这个问题?甚至在控制器验证代码启动之前就会发生这种情况,所以简单地抛出@Required并没有帮助:
@64m30kf1p
Internal Server Error (500) for request POST /sprockets/upload
Oops: NullPointerException
An unexpected error occured caused by exception NullPointerException: null
play.exceptions.UnexpectedException: Errors serializationProblem
at play.data.validation.ValidationPlugin.save(ValidationPlugin.java:146)
at play.data.validation.ValidationPlugin.onActionInvocationResult(ValidationPlugin.java:65)
at play.mvc.ActionInvoker.invoke(ActionInvoker.java:293)
at Invocation.HTTP Request(Play!)
Caused by: java.lang.NullPointerException
at play.data.validation.ValidationPlugin.save(ValidationPlugin.java:136)
... 3 more
我的最终目标是向用户显示一条漂亮的错误消息,但Play阻止我这样做。这与OS X上的Play 1.1有关,如果它有所作为。
答案 0 :(得分:1)
可能的解决方法是@ Before-Interceptor。在那里,您可以检查参数并重定向到错误页面。这应该工作。请使用一个小示例应用程序在http://play.lighthouseapp.com创建一张票。
答案 1 :(得分:0)
您的表单和控制器不匹配
<input type="file" name="sprocketFile" size="chars" />
表示您正在将File对象上传到名为sprocketFile
但是,您的代码表示您存储在名为licenceFile
public static void upload(File licenseFile) {
尝试进行两场比赛。
答案 2 :(得分:0)
我找到了问题的根源,这是我自己的错。手头的问题自然是原始问题中没有包含的来源的一部分。这是示例代码:
public static void upload(@Required File sprocketFile) {
try {
if (sprocketFile == null || validation.hasErrors()) {
validation.addError("Upload Error", "Please select a sprocket to upload", sprocketFile);
params.flash();
validation.keep();
index();
}
问题是使用sprocketFile作为validation.addError()中的最后一个参数。我在NetBeans中以调试模式运行应用程序时发现了这一点。谢谢你的帮助@niels。