O upload de um arquivo vazio resulta automaticamente em um NPE
-
25-09-2019 - |
Pergunta
Sou um novato na estrutura da peça, mas não vejo nenhuma documentação sobre como abordar isso. Basicamente, tenho um formulário para fazer upload de um arquivo de texto para o servidor, aqui está o trecho relevante:
#{form @Sprockets.upload() , enctype:'multipart/form-data' }
<input type="file" name="sprocketFile" size="chars" />
<input type="submit" value="Submit Sprocket" />
#{/form}
No lado do controlador, aqui está o método de upload:
public static void upload(File sprocketFile) {
}
Meu problema é que, se o usuário não se incomodar em preencher o formulário e apenas atingir o "Enviar Sprocket", o play gera automaticamente um NPE, pois tenta converter os dados do formulário em um arquivo. Como posso contornar isso? Isso acontece mesmo antes de o código de validação do controlador entrar em ação, então simplesmente jogar um @Required não ajuda:
@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
Meu objetivo final é mostrar uma boa mensagem de erro ao usuário, mas o Play está me impedindo de fazer isso. Isso ocorre com o Play 1.1 no OS X se fizer a diferença.
Solução 3
Encontrei a fonte do problema, e é minha culpa minha. A questão em questão faz parte da fonte que não incluí na pergunta original. Aqui está o código de amostra:
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();
}
O problema estava usando o sprocketfile como o último parâmetro em validation.adderror (). Descobri isso enquanto executava o aplicativo no modo de depuração no NetBeans. Obrigado pela sua ajuda @niels.
Outras dicas
Possível solução alternativa seria um @anterior-interceptor. Lá você pode verificar o paramter e redirecionar para uma página de erro. Isso deve funcionar. Por favor, crie um ingresso em http://play.lighthouseApp.com com um pequeno exemplo de aplicativo.
Você forma e controlador não correspondem
<input type="file" name="sprocketFile" size="chars" />
Diz que você está enviando um objeto de arquivo para uma variável nomeada sprocketFile
Mas, seu código diz que você está armazenando em um objeto nomeado licenceFile
public static void upload(File licenseFile) {
Tente fazer as duas partidas.