Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 自动上载空文件会导致NPE_Java_File Upload_Nullpointerexception_Playframework - Fatal编程技术网

Java 自动上载空文件会导致NPE

Java 自动上载空文件会导致NPE,java,file-upload,nullpointerexception,playframework,Java,File Upload,Nullpointerexception,Playframework,我对Play框架有点陌生,但我没有看到任何关于如何实现这一点的文档。基本上,我有一个表单可以将文本文件上传到服务器,下面是相关的代码片段: #{form @Sprockets.upload() , enctype:'multipart/form-data' } <input type="file" name="sprocketFile" size="chars" /> <input type="submit" value="Submit Sprocket" />

我对Play框架有点陌生,但我没有看到任何关于如何实现这一点的文档。基本上,我有一个表单可以将文本文件上传到服务器,下面是相关的代码片段:

#{form @Sprockets.upload() , enctype:'multipart/form-data' }
  <input type="file" name="sprocketFile" size="chars" />
  <input type="submit" value="Submit Sprocket" />
#{/form}
我的问题是,如果用户不需要填充表单,只需点击“提交链轮”,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有区别。

您的表单和控制器不匹配

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

尝试使两个匹配。

您的窗体和控制器不匹配

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

尝试使两个匹配。

可能的解决方法是使用@Before拦截器。在那里,您可以检查参数并重定向到错误页面。这应该行得通。请使用一个小示例应用程序在创建票证。

可能的解决方法是使用@Before拦截器。在那里,您可以检查参数并重定向到错误页面。这应该行得通。请使用一个小的示例应用程序在创建一张罚单。

我找到了问题的根源,这是我自己的错。手头的问题自然是我在原始问题中没有包括的来源的一部分。以下是示例代码:

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();
}

问题是使用链轮文件作为validation.addError()中的最后一个参数。我在NetBeans中以调试模式运行应用程序时发现了这一点。谢谢你的帮助@niels。

我找到了问题的根源,这是我自己的错。手头的问题自然是我在原始问题中没有包括的来源的一部分。以下是示例代码:

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();
}

问题是使用链轮文件作为validation.addError()中的最后一个参数。我在NetBeans中以调试模式运行应用程序时发现了这一点。谢谢你的帮助@niels.

你能提供完整的堆栈跟踪和准确的播放版本吗。@niels:很遗憾,上面是完整的堆栈跟踪。疯狂我检查了播放代码,看不出有什么可能是空的:-/play coreteam今天似乎不活动,所以请耐心等待。你能提供完整的堆栈跟踪和准确的播放版本吗。@niels:很遗憾,上面是完整的堆栈跟踪。疯狂我检查了播放代码,看不出有什么可能是空的:-/播放coreteam今天似乎不活动,所以请耐心等待。哎呀,我更改了变量名以保护罪犯,但没有捕捉到=)它们在我的代码中是一致的,我在使用文件时从来没有遇到过这个问题,但我一直使用Blob(我在Play1.1之前使用了FileAttachment)。尝试使用Blob而不是File.Oops,我已经更改了变量名以保护罪犯,但没有捕捉到=)它们在我的代码中是一致的,我已经如上所述更改了它们。我在使用文件时从来没有遇到过这个问题,但我一直使用Blob(嗯,我在Play1.1之前使用了FileAttachment)。尝试使用Blob而不是File。