[Wicket-ja-user 608] Re: ListView を内にFileUploadField使用時のWicketNotSerializableExceptionの対処方法

Back to archive index

Tsutomu Yano t_yano****@me*****
2012年 2月 6日 (月) 23:24:45 JST


矢野です。

FileUploadクラスの解説にあるように、FileUploadFieldのモデル値であるFileUploadオブジェクトを格納するフィールドには、transientを指定してください。

http://wicket.apache.org/apidocs/1.5/org/apache/wicket/markup/html/form/upload/FileUpload.html

これにより、FileUploadオブジェクトはシリアライズ対象にならないので、DiskPageStoreのままでもエラーが起きなくなると思います。
FileUploadField の方のJavaDocにも重要なコメントがあって、

http://wicket.apache.org/apidocs/1.5/org/apache/wicket/markup/html/form/upload/FileUploadField.html

FileUploadFieldのモデル値は、リクエスト・レスポンスの終わりでリセットされるので、ファイルを受信したら、レスポンスを返すまでに、すぐに処理しなさい、という話です。FileUploadオブジェクトの持つDeferredFileOutputStreamがクローズされてしまうからです。

逆に言えば、上記のことにより、FileUploadFieldのモデル値であるFileUploadオブジェクトをセッション維持しておく意味はないので、フィールドをtransientにしてしまっても大丈夫だということです。

ちなみに、HttpSessionStoreに変えると、DiskPageStoreへのシリアライズがなくなるので一旦はワーニングが出なくなりますが、サーブレットコンテナはどのみちHttpSessionをシリアライズするんでしょうし、問題は残るはずです。問題がWicketが関知するところの外に出てしまったってだけで。

---------------------------------------------------
矢野 勉(やの つとむ)
電子メール: t_yano****@me*****
---------------------------------------------------

On 2012/02/06, at 16:41, maeda wrote:

> いつもお世話になっております。
> maedaです。
> 
> ListView内にFileUploadFieldを配置し
> 複数のファイルを一度にアップロードする処理を行っているのですが
> 処理は正しく行われますが、ログに以下の例外が表示されてしまいします。
> 
> 
> SessionStoreにDiskPageStoreを指定しているので
> DeferredFileOutputStreamクラスがシリアライズできないといわれて怒られているということでしょうか?
> 
> SessionStoreにHttpSessionStoreを指定することにより下記例外は表示されなくなったのですが
> DiskPageStoreを指定したままで他に対応策等ありませんでしょうか?
> 
> 分かりにくい説明ですが、よろしくお願いいたします。
> 
> ログ
> Field hierarchy is:
>  4 [class=iandc.wicket.page.pdf.upload.PdfFindList, path=4]
>    private java.lang.Object org.apache.wicket.MarkupContainer.children [class=org.apache.wicket.markup.html.form.Form, path=4:form]
>      private java.lang.Object org.apache.wicket.MarkupContainer.children [class=[Ljava.lang.Object;]
>        java.util.HashMap iandc.wicket.validation.validator.InputValidator.map[write:1][write:2][4] [class=iandc.wicket.page.pdf.upload.PdfFindList$3, path=4:form:list]
>          java.lang.Object org.apache.wicket.Component.data [class=org.apache.wicket.model.util.WildcardListModel]
>            private java.lang.Object org.apache.wicket.model.util.GenericBaseModel.object [class=java.util.ArrayList]
>              private java.lang.Object org.apache.wicket.model.util.GenericBaseModel.object[write:1] [class=iandc.wicket.form.pdf.PdfFindListBean]
>                private org.apache.wicket.markup.html.form.upload.FileUpload iandc.wicket.form.pdf.PdfFindListBean.fileUploadField [class=org.apache.wicket.markup.html.form.upload.FileUpload]
>                  private final org.apache.wicket.util.upload.FileItem org.apache.wicket.markup.html.form.upload.FileUpload.item [class=org.apache.wicket.util.upload.DiskFileItem]
>                    private org.apache.wicket.util.io.DeferredFileOutputStream org.apache.wicket.util.upload.DiskFileItem.dfos [class=org.apache.wicket.util.io.DeferredFileOutputStream] <----- field that is not serializable
> 
> 
> 
> 以下テストソース
> public class TestPage extends AuthenticatedWebPage implements Const {
> 
> 	Form form;
> 	List<TestBean> list;
> 
> 	/**
> 	 *
> 	 * 初期処理
> 	 *
> 	 *
> 	 */
> 	public TestPage(FindBean findBean) {
> 		//FORM
> 		form = new Form("form",new CompoundPropertyModel(findBean));
> 		form.setMultiPart(true);
> 		this.add(form);
> 
> 		//一覧取得
> 		list = service.find(pdfFindBean);
> 
> 		//一覧
> 		final ListView listview = new ListView("list",pdfList){
> 			@Override
> 			protected void populateItem(final ListItem listItem) {
> 				final TestBean buf = (TestBean) listItem.getModelObject();
> 
> 				//各項目
> 				listItem.setModel(new CompoundPropertyModel(buf));
> 				listItem.add(new Label("no"));
> 				listItem.add(new FileUploadField("fileUploadField"));
> 			}
> 		};
> 		form.add(listview);
> 
> 		form.add(uploadLink);
> 
> 	}
> 
> 	/**
> 	 *
> 	 * アップロード
> 	 *
> 	 */
> 	private SubmitLink uploadLink = new SubmitLink("uploadLink"){
> 		@Override
> 		public void onSubmit(){
> 			for(TestBean buf:list){
> 				if(buf.getFileUploadField() == null){
> 					continue;
> 				}
> 			}
> 
> 		}
> 	};
> 
> }
> 
> 
> 
> public class TestBean extends implements Serializable {
> 	private String no;
> 	private Integer key;
> 	private FileUpload fileUploadField;
> 
> 	//以下略・・・。
> }
> 
> _______________________________________________
> Wicket-ja-user mailing list
> Wicke****@lists*****
> http://lists.sourceforge.jp/mailman/listinfo/wicket-ja-user




Wicket-ja-user メーリングリストの案内
Back to archive index