Un fichier vide téléchargement entraîne automatiquement un NPE
-
25-09-2019 - |
Question
Je suis un peu d'un débutant au cadre de lecture, mais je ne vois pas de documentation sur la façon d'aborder ce sujet. Fondamentalement, j'ai un formulaire pour télécharger un fichier texte sur le serveur, voici l'extrait pertinent:
#{form @Sprockets.upload() , enctype:'multipart/form-data' }
<input type="file" name="sprocketFile" size="chars" />
<input type="submit" value="Submit Sprocket" />
#{/form}
Du côté du contrôleur, voici la méthode de téléchargement:
public static void upload(File sprocketFile) {
}
Mon problème est que si l'utilisateur ne prend pas la peine peuplant la forme et frappe juste « Soumettre Sprocket », Jouer génère automagiquement un NPE comme il tente de convertir les données de formulaire dans un fichier. Comment puis-je contourner cela? Cela se produit avant même le code de validation du contrôleur entre en jeu, donc tout simplement jeter dans un @Required ne permet pas:
@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
Mon objectif final est de montrer un joli message d'erreur à l'utilisateur, mais le jeu me empêche de le faire. Ceci est avec le jeu 1.1 sur OS X si cela fait une différence.
La solution 3
J'ai trouvé la source du problème, et il est de ma faute. La question à l'est naturellement partie de la source que je ne mentionnaient pas la question initiale. Voici l'exemple de code:
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();
}
La question utilisait la sprocketFile comme le dernier paramètre dans validation.addError (). J'ai découvert ce lors de l'exécution de l'application en mode débogage dans NetBeans. Merci pour votre @niels d'aide.
Autres conseils
solution possible serait un @ Avant-Interceptor. Là, vous pouvez vérifier la paramter et rediriger vers une page d'erreur. Cela devrait fonctionner. S'il vous plaît créer un billet http://play.lighthouseapp.com avec une petite application par exemple.
Vous formez et le contrôleur ne correspondent pas
<input type="file" name="sprocketFile" size="chars" />
indique que vous téléchargez un fichier objet à une variable nommée sprocketFile
Mais, votre code dit que vous stockez dans un objet licenceFile
nommé
public static void upload(File licenseFile) {
Essayez de faire les deux correspondent.