Il caricamento di un file vuoto si traduce automaticamente in un NPE
-
25-09-2019 - |
Domanda
io sono un po 'di un novizio di Play quadro, ma non vedo alcuna documentazione su come affrontare questo. Fondamentalmente ho un modulo per caricare un file di testo al server, ecco il frammento in questione:
#{form @Sprockets.upload() , enctype:'multipart/form-data' }
<input type="file" name="sprocketFile" size="chars" />
<input type="submit" value="Submit Sprocket" />
#{/form}
Dal punto di vista di controllo, ecco il metodo di caricamento:
public static void upload(File sprocketFile) {
}
Il mio problema è che se l'utente non si preoccupa popolando la forma e colpisce solo "Invia Sprocket", Gioca automagicamente genera un NPE in quanto cerca di convertire i dati del modulo in un file. Come posso ovviare a questo? Questo accade anche prima dei calci di codice di convalida del controller in, così semplicemente gettando in un @Required non aiuta:
@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
Il mio obiettivo finale è quello di mostrare un bel messaggio di errore indietro per l'utente, ma il gioco mi impedisce di fare questo. Questo è con Play 1.1 su OS X, se si fa la differenza.
Soluzione 3
Ho trovato la fonte del problema, ed è colpa mia. La questione a portata di mano è naturalmente parte della sorgente non ho incluso nella domanda iniziale. Ecco il codice di esempio:
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();
}
Il problema stava usando lo sprocketFile come ultimo parametro a validation.addError (). Ho scoperto questo durante l'esecuzione l'applicazione in modalità di debug in NetBeans. Grazie per il vostro aiuto @niels.
Altri suggerimenti
possibile soluzione sarebbe un @ Prima-Interceptor. Ci si può controllare la paramter e reindirizzamento ad una pagina di errore. Questo dovrebbe funzionare. Si prega di creare un biglietto a http://play.lighthouseapp.com con un piccolo esempio di applicazione.
Si forma e il controller non corrispondono
<input type="file" name="sprocketFile" size="chars" />
Dice che si sta caricando un oggetto File a un nome sprocketFile
variabile
Ma, il codice dice si archiviano in un oggetto denominato licenceFile
public static void upload(File licenseFile) {
Prova a fare i due partita.