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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top