2010-12-09 49 views
1

我对Play Framework有点新手,但是我没有看到任何有关如何处理这个问题的文档。基本上,我有一个表格到一个文本文件上传到服务器,这里的相关片段:上传一个空文件会自动产生一个NPE

#{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) { 
} 

我的问题是,如果用户不打扰填充表单,只是点击“Submit 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 

我的最终目标是展示一个漂亮的错误信息返回给用户,但玩的就是阻止我从这样做。这与OS X上的Play 1.1相关,如果它有所作为。

+0

你可以提供整个堆栈跟踪和确切的播放版本。 – niels 2010-12-09 20:35:22

+0

@niels:可悲的是,以上是完整的堆栈跟踪。 – 2010-12-10 14:46:31

回答

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。

0

您的形式和控制器不匹配

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

说你是上传文件对象命名sprocketFile

但一个变量,你的代码说你是存储在名为对象licenceFile

public static void upload(File licenseFile) { 

试着做两个匹配。

1

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

相关问题