難産

TeedaMyFacesのtomahawkを使用してファイルのアップロードを実装しようとしているが、うまくいかない。
http://localhost:8080/examples/view/accept/accept.html を呼び出すと、コンソールに以下のログが表示される。

:
DEBUG 2007-02-02 10:02:27,809 [http-8080-Processor25] クラス(examples.web.accept.AcceptPage[accept_acceptPage])のコンポーネント定義を登録します
WARN  2007-02-02 10:02:27,889 [http-8080-Processor25] examples.web.accept.AcceptPage$$EnhancedByS2AOP$$190ed52のプロパティ(uploadedFile)が見つからないので設定をスキップします
:

適当なファイルをアップロードしたが、doUploadメソッドにブレークポイントを貼って、uploadedFileを確認したが、nullになっている。setUploadedFile(UploadedFile)が呼ばれていないためである。
なぜ、setUploadedFileメソッドが呼ばれないのか分からない。現在、原因を調査中。

  1. Dolteng 0.16.1 で Teeda + S2Dao のプロジェクトexamplesを作成。
  2. WEB-INFにtomahawk 1.1.1のjarとcommons-fileupload-1.1.1.jarをコピーし、ビルドパスに登録。
  3. web.xmlに拡張フィルタを追加
:
	<filter>
		<filter-name>extensionsFilter</filter-name>
		<filter-class>org.apache.myfaces.webapp.filter.ExtensionsFilter</filter-class>
		<init-param>
			<param-name>uploadMaxFileSize</param-name>
			<param-value>100m</param-value>
			<description>Set the size limit for uploaded files.
				Format:	10 - 10 bytes
						10k - 10 KB
						10m - 10 MB
						1g - 1 GB
			</description>
		</init-param>
		<init-param>
			<param-name>uploadThresholdSize</param-name>
			<param-value>100m</param-value>
			<description>Set the thrshold size -files
				below this limit are stored in memory, files above
				this limit are stored on disk.
				
				Format:	10 - 10 bytes
						10k - 10 KB
						10m - 10 MB
						1g - 1 GB
			</description>
		</init-param>
		<init-param>
			<param-name>uploadRepositoryPath</param-name>
			<param-value>/work</param-value>
			<description>Set the path where the intermediary files will be stored.</description>
		</init-param>
	</filter>
:
	<filter-mapping>
		<filter-name>extensionsFilter</filter-name>
		<url-pattern>*.html</url-pattern>
	</filter-mapping>
  1. accept.htmlをsrc/main/webapp/view/acceptに作成。
:
<body>
	<form enctype="multipart/form-data">
		<x:inputFileUpload id="uploadedFile" value="#{accept_acceptPage.uploadedFile}"/>
		<input type="submit" id="doUpload" value="UPLOAD"/>
	</form>
</body>
:
  1. Doltengでaccept.htmlに対応するAcceptPage.javaを生成
package examples.web.accept;

import java.io.Serializable;

import org.apache.myfaces.custom.fileupload.UploadedFile;

public class AcceptPage implements Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	/**
	 * アップロードファイル
	 */
	private UploadedFile uploadedFile;

	/**
	 * アップロードファイルを取得する
	 * @return アップロードファイル
	 */
	public UploadedFile getUploadedFile() {
		return uploadedFile;
	}

	/**
	 * アップロードファイルを設定する
	 * @param uploadedFile	アップロードファイル
	 */
	public void setUploadedFile(UploadedFile uploadedFile) { //このメソッドが呼ばれない
		this.uploadedFile = uploadedFile;
		System.out.println("uploadFileSize[" + uploadedFile.getSize() + "]");
		System.out.println("uploadFileName[" + uploadedFile.getName() + "]");
	}

	/**
	 * アップロードがクリックされたときの処理
	 * @return
	 */
	public String doUpload() {
		//setUploadedFileが呼ばれないため、uploadedFileがnullである。
		if(uploadedFile != null){
			System.out.println("file size [" + uploadedFile.getSize() + "]");
		}
		return null;
	}

	public String initialize() {
		return null;
	}

	public String prerender() {
		return null;
	}
}

AcceptPageクラスのuploadedFileとaccept.htmlのuploadedFileは関連付けられているはずである。というのは、お互いのソースエディターの左端に双方向矢印が表示されていて、DoltengでOpen Pair Pageをすると、お互いの行に移動するためである。

大谷さんのブログにあるサンプルを参考に、また、訪問者という方が同じ状況に遭われていたようですが、filter-mappingを設定していなかったために出ていたようでした。当方は、filter-mappingの設定は行っているにもかかわらず、同様の現象が発生しています。
setUploadedFileが呼ばれないということはaccept.htmlとAcceptPageクラスのuploadedFileに実際は関連付けられていないためだと思われます。その辺から原因を突き止めると、解決していくような気がする。
teedaではなく、S2JSFではあるが、wataka日記でアップロードできないという現象に出くわしたとある。もっともこれは単純ミス(内容は不明)だったようだ。
あと、しままる@はてなにも同じくS2JSFでまったく同じような現象に出くわしているようだが、Teeda coreを最新のものにしたら動くようになったということだ。しかし、このブログは2006/07/20のもので、teedaがβ2だったようで、こちらはteeda-1.0.3なので、直っているはずである。

ちなみに再現環境は以下のとおりである。