eine leere Datei Hochladen führt automatisch zu einem NPE
-
25-09-2019 - |
Frage
Ich bin ein bisschen ein Neuling auf der Play-Framework, aber ich sehe keine Dokumentation darüber, wie dies zu nähern. Im Grunde habe ich eine Form bekam eine Textdatei auf den Server, hier ist der entsprechende Code-Schnipsel laden:
#{form @Sprockets.upload() , enctype:'multipart/form-data' }
<input type="file" name="sprocketFile" size="chars" />
<input type="submit" value="Submit Sprocket" />
#{/form}
Auf der Steuerungsseite, hier ist die Upload-Methode:
public static void upload(File sprocketFile) {
}
Mein Problem ist, dass, wenn der Benutzer nicht stört die Form bevölkert und nur Hits „Submit Sprocket“, Wiedergabe automatisch eine NPE erzeugt, wie es die Formulardaten in eine Datei zu konvertieren versucht. Wie kann ich dieses Problem umgehen? Dies geschieht auch vor den Controller Validierungscode Kicks, so einfach in einem @Required wirft nicht hilft:
@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
Mein Endziel ist eine ziemlich Fehlermeldung zurück an den Benutzer zu zeigen, aber Spiele hindern mich dies zu tun. Dies ist mit Play 1.1 auf OS X, wenn es einen Unterschied macht.
Lösung 3
Ich habe die Ursache des Problems gefunden, und es ist meine eigene Schuld. Das Problem bei der Hand ist natürlich Teil der Quelle, die ich nicht in der ursprünglichen Frage enthalten war. Hier ist der Beispielcode:
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();
}
Das Problem wurde mit der sprocketFile als letzte Parameter in validation.addError (). Ich entdeckte dies, während die App im Debug-Modus in NetBeans läuft. Danke für Ihre Hilfe @niels.
Andere Tipps
Mögliche Abhilfe würde ein @ Vor-Interceptor sein. Dort können Sie die Paramter und Umleitung auf eine Fehlerseite überprüfen. Das sollte funktionieren. Bitte legen Sie ein Ticket an http://play.lighthouseapp.com mit einer kleinen Beispiel-Anwendung.
Sie bilden und Controller nicht übereinstimmen
<input type="file" name="sprocketFile" size="chars" />
sagt, dass Sie ein File-Objekt auf eine Variable mit dem Namen sprocketFile
Hochladen
Aber Ihr Code sagt, Sie in einem Objekt namens licenceFile
werden Speichern
public static void upload(File licenseFile) {
Versuchen Sie, die zwei Spiele zu machen.