1

私は Play フレームワークの初心者ですが、これにアプローチする方法に関するドキュメントは見当たりません。基本的に、サーバーにテキスト ファイルをアップロードするためのフォームがあります。関連するスニペットは次のとおりです。

#{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) {
}

私の問題は、ユーザーがわざわざフォームに入力せずに "Submit Sprocket" をクリックした場合、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 がこれを妨げています。違いがある場合、これは OS X の Play 1.1 です。

4

3 に答える 3

1

考えられる回避策は、@Before-Interceptorです。そこで、パラメータを確認してエラーページにリダイレクトできます。これは機能するはずです。小さなサンプルアプリケーションを使用して、http://play.lighthouseapp.comでチケットを作成してください。

于 2010-12-10T15:48:14.940 に答える
0

私は問題の原因を見つけました、そしてそれは私自身のせいです。手元にある問題は、当然、元の質問に含めなかった情報源の一部です。サンプルコードは次のとおりです。

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

問題は、validation.addError()の最後のパラメーターとしてsprocketFileを使用することでした。NetBeansでデバッグモードでアプリを実行しているときにこれを発見しました。@nielsにご協力いただきありがとうございます。

于 2010-12-10T16:09:15.663 に答える
0

フォームとコントローラーが一致しません

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

ファイルオブジェクトをという名前の変数にアップロードしているとしますsprocketFile

しかし、あなたのコードは、次の名前のオブジェクトに保存していると言っていますlicenceFile

public static void upload(File licenseFile) {

2つを一致させてみてください。

于 2010-12-10T09:38:07.120 に答える