2010-12-09 48 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上創建一張票。

相關問題