2010-12-09 50 views
1

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:un fichier vide Uploading entraîne automatiquement un NPE

#{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 dérange pas de remplir le formulaire et frappe juste "Soumettre Sprocket", Play génère automatiquement un NPE comme il essaie de convertir les données de formulaire dans un fichier. Comment je peux 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 faire cela. C'est avec Play 1.1 sur OS X si cela fait une différence.

+0

Pouvez-vous fournir l'ensemble de la pile et la version exacte du jeu? – niels

+0

@niels: Malheureusement, ce qui précède est la trace de la pile complète. –

+0

Crazy J'ai vérifié le code de jeu et ne peux pas voir ce qui pourrait être nul là: -/Le jeu-coreteam semble aujourd'hui inactif alors soyez patient. – niels

Répondre

0

que j'ai trouvé la source du problème, et il est de ma faute. Le problème en question fait naturellement partie de la source que je n'ai pas incluse dans 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 le sprocketFile comme le dernier paramètre dans validation.addError(). Je l'ai découvert en exécutant l'application en mode débogage dans NetBeans. Merci pour votre aide @niels.

0

formulaire Vous et le contrôleur ne correspondent pas

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

dit que vous téléchargez un objet fichier à une variable nommée sprocketFile

Mais, votre code dit que vous stockez dans un objet nommé licenceFile

public static void upload(File licenseFile) { 

Essayez de faire les deux correspondent.

+0

Oups, j'avais changé les noms des variables pour protéger les coupables, mais je n'ai pas attrapé celui-ci =) Ils sont cohérents dans mon code, et je les ai modifiés comme ci-dessus. –

+1

Je n'ai jamais eu ce problème en utilisant des fichiers, mais j'ai toujours utilisé Blob (bien, j'ai utilisé FileAttachment avant Play1.1). Essayez d'utiliser Blob au lieu de Fichier. – Codemwnci

1

solution possible serait un @ Avant-Interceptor. Là, vous pouvez vérifier le paramètre et rediriger vers une page d'erreur. Cela devrait fonctionner. Veuillez créer un ticket au http://play.lighthouseapp.com avec un petit exemple d'application.