Pregunta

Soy un poco novato en Play Framework, pero no veo ninguna documentación sobre cómo abordar esto.Básicamente tengo un formulario para cargar un archivo de texto en el servidor, aquí está el fragmento relevante:

#{form @Sprockets.upload() , enctype:'multipart/form-data' }
  <input type="file" name="sprocketFile" size="chars" />
  <input type="submit" value="Submit Sprocket" />
#{/form}

Del lado del controlador, aquí está el método de carga:

public static void upload(File sprocketFile) {
}

Mi problema es que si el usuario no se molesta en completar el formulario y simplemente presiona "Enviar Sprocket", Play genera automáticamente un NPE mientras intenta convertir los datos del formulario en un archivo.¿Cómo puedo solucionar esto?Esto sucede incluso antes de que se active el código de validación del controlador, por lo que simplemente agregar un @Required no ayuda:

@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

Mi objetivo final es mostrar un bonito mensaje de error al usuario, pero Play me impide hacerlo.Esto es con Play 1.1 en OS X si hace la diferencia.

¿Fue útil?

Solución 3

Encontré la fuente del problema y es culpa mía.El problema que nos ocupa es, naturalmente, parte de la fuente que no incluí en la pregunta original.Aquí está el código de muestra:

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();
}

El problema era usar sprocketFile como último parámetro en validation.addError().Descubrí esto mientras ejecutaba la aplicación en modo de depuración en NetBeans.Gracias por tu ayuda @niels.

Otros consejos

Posible solución sería un @ Antes-interceptor. No se puede comprobar el parametro y redirección a una página de error. Esto debería funcionar. Por favor, cree un ticket en http://play.lighthouseapp.com con un pequeño ejemplo de aplicación.

Se forman y el controlador no coinciden

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

Dice que está cargando un objeto File para una variable llamada sprocketFile

Sin embargo, el código dice que está almacenando en un objeto denominado licenceFile

public static void upload(File licenseFile) {

Trate de hacer los dos coinciden.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top