Загрузка пустого файла автоматически приводит к NPE - PullRequest
1 голос
/ 09 декабря 2010

Я немного новичок в Play Framework, но я не вижу никакой документации о том, как подойти к этому.В основном у меня есть форма для загрузки текстового файла на сервер, вот соответствующий фрагмент:

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

На стороне контроллера, вот метод загрузки:

public static void upload(File sprocketFile) {
}

Мойпроблема заключается в том, что если пользователь не утруждает себя заполнением формы и просто нажимает «Отправить звездочку», Play автоматически генерирует NPE при попытке преобразовать данные формы в файл.Как я могу обойти это?Это происходит даже до того, как код проверки контроллера вступает в силу, поэтому простое добавление @Required не поможет:

@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

Моя конечная цель - показать пользователю красивое сообщение об ошибке, но Playмешает мне сделать это.Это с Play 1.1 на OS X, если это имеет значение.

Ответы [ 3 ]

1 голос
/ 10 декабря 2010

Возможный обходной путь - @ Before-Interceptor. Там вы можете проверить параметры и перенаправить на страницу ошибки. Это должно работать. Пожалуйста, создайте заявку на http://play.lighthouseapp.com с небольшим примером приложения.

0 голосов
/ 10 декабря 2010

Я нашел источник проблемы, и это моя вина.Рассматриваемая проблема, естественно, является частью источника, который я не включил в исходный вопрос.Вот пример кода:

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

Проблема заключалась в использовании sprocketFile в качестве последнего параметра в validation.addError ().Я обнаружил это во время работы приложения в режиме отладки в NetBeans.Спасибо за вашу помощь @ niels.

0 голосов
/ 10 декабря 2010

Ваша форма и контроллер не совпадают

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

Говорит, что вы загружаете объект File в переменную с именем sprocketFile

Но ваш код говорит, что вы храните в объекте с именем licenceFile

public static void upload(File licenseFile) {

Попробуйте сопоставить две пары.

...