1

我是 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) {
}

我的问题是,如果用户不费心填充表单而只是点击“提交 Sprocket”,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。

4

3 回答 3

1

可能的解决方法是@Before-Interceptor。在那里您可以检查参数并重定向到错误页面。这应该有效。请使用小示例应用程序在http://play.lighthouseapp.com上创建票证。

于 2010-12-10T15:48:14.940 回答
0

您的表单和控制器不匹配

<input type="file" name="sprocketFile" size="chars" />

说您正在将 File 对象上传到名为的变量sprocketFile

但是,您的代码说您存储在一个名为licenceFile

public static void upload(File licenseFile) {

尝试使两者匹配。

于 2010-12-10T09:38:07.120 回答
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。

于 2010-12-10T16:09:15.663 回答