OracleでS2Pagerを使う

 DBはOracleでS2Pagerを利用していますが、スクロール可能カーソルをONにするとOffsetが0だと下記のエラーが発生します。利用したJDBCドライバーは、Oracle JDBC Driver 10.2.0.1.0(ojdbc14.jar)です。
 とりあえず、スクロール可能カーソルをOFFで利用しているのですが、JDBCドライバの問題でしょうか?

[ESSR0071]SQLで例外が発生しました。理由はjava.sql.SQLException: コールに無効な引数があります。: absolute (0)

ozacc-mail libraryをJDK1.4.2環境で使う

 ozacc-mail library1.1.5を使おうと、jarファイルをlib以下に入れたら下記のエラーが発生しました。

エラー内容

2006-02-21 18:59:53,925 [main] ERROR org.apache.struts.action.ActionServlet - Unable to initialize Struts ActionServlet due to an unexpected exception or error thrown, so marking the servlet as unavailable.  Most likely, this is due to an incorrect or missing library dependency.
java.lang.UnsupportedClassVersionError: com/ozacc/mail/VelocityMailBuilder (Unsupported major.minor version 49.0)


 ソースをダウンロードして、JDK1.4.2でビルドしたjarファイルを利用したらOKでした。早くTigerに移行したいなぁ。

S2StrutsのPOJO Actionにおけるタイムアウト処理 その2

 よく考えたらPOJO Actionを利用した時は、ActionMappingを取得しなくても、global-forwardに定義したフォワード名を文字列として返せば良いだけでした。結局こんな感じでOKですね。

struts-config.xml


  

loginCheckInterceptor.java

public class LoginCheckInterceptor implements MethodInterceptor {

  public Object invoke(MethodInvocation invocation) throws Throwable {

    HttpServletRequest request = SingletonS2ContainerFactory.getContainer().getRequest();
    HttpSession session = request.getSession(false);

    if (session!=null && session.getAttribute(Globals.SESSION_KEY)!=null) {
        // ログイン済み
        return invocation.proceed();
    } else {
        // タイムアウト
        MessageManager.addGlobalError("errors.login.timeout");
        MessageManager.saveErrors();
        return "timeout";
    }
}

S2StrutsのPOJO Actionにおけるタイムアウト処理

 Interceptorでタイムアウト処理をしようと思ったのですが、POJO Actionを利用していているので、invocation.getArguments()ではActionMappingもHttpRequestも取得できないようです。どうやって取得するのが良いのでしょうか?
 PojoActionExecuteCommandに、Interceptorを指定するしかないでしょうか?

S2StrutsのPOJO Actionで複数メソッドがある場合のデフォルト

 POJO Actionで複数メソッドがある場合に、デフォルトのメソッドを指定できたら便利だなぁと思いました。アノテーションで指定?。ちょっと調べてみようかな。

【追記】
 DispatchPojoActionCommandを変えればよさそう。あとは、デフォルト値を何で指定するかを考えれば良いかな。

S2StrutsのPOJO Actionにおけるvalidation処理の切り替え

 Actionクラスを1画面1Actionのルールで作成して、parameter属性でボタン毎のメソッドを振り分けています。呼び出すメソッド毎にvalidation処理を切り替えたいのですが、何か良い方法はあるでしょうか。
 POJO Formを引数にvalidateメソッドを実行したら、そのPOJO Formに設定されているvalidationが行えると良いなぁと思っています。

【追記】
 Strutsのソースを調査して作成してみました。一応うまく動いているようです。

PojoFormValidatorFacade.javaファイルの作成

import org.apache.struts.action.ActionMessages;

public interface PojoFormValidatorFacade {

    public ActionMessages validate(String validationKey, Object pojoForm);

}


PojoFormValidatorFacadeImpl.javaファイルの作成

import org.apache.commons.validator.Validator;
import org.apache.commons.validator.ValidatorException;
import org.apache.struts.action.ActionMessages;
import org.apache.struts.validator.BeanValidatorForm;
import org.apache.struts.validator.Resources;
import org.seasar.framework.container.factory.SingletonS2ContainerFactory;

public class PojoFormValidatorFacadeImpl implements PojoFormValidatorFacade {

    public ActionMessages validate(String validationKey, Object pojoForm){
        BeanValidatorForm validatorForm = new BeanValidatorForm(pojoForm);
        ActionMessages errors = new ActionMessages();
        Validator validator = Resources.initValidator(
                validationKey,
                validatorForm,
                SingletonS2ContainerFactory.getContainer().getServletContext(),
                SingletonS2ContainerFactory.getContainer().getRequest(),
                errors,
                0);
        try {
            validator.validate();
        } catch (ValidatorException e) {
        }
        return errors;
    }

}


PojoFormValidator.javaファイルの作成

import org.apache.struts.action.ActionMessages;
import org.seasar.framework.container.factory.SingletonS2ContainerFactory;

public class PojoFormValidator {

    public static ActionMessages validate(String validationKey, Object pojoForm){
        return getPojoFormValidatorFacade().validate(validationKey, pojoForm);
    }

    private static PojoFormValidatorFacade getPojoFormValidatorFacade() {
        return (PojoFormValidatorFacade) SingletonS2ContainerFactory.getContainer().getComponent(PojoFormValidatorFacade.class);
    }
}


diconにコンポーネントを登録



呼び出し方法

 呼び出しは、validation.xmlのname属性とPOJO Formを渡します。name属性を呼ばれたメソッド毎に変えれば、バリデーション処理の内容も変更可能です。

ActionMessages errors = PojoFormValidator.validate("entryForm", entryForm);

ドキュメントの誤り

 S2Strutsのドキュメントに下記の誤りがあります。
・ExportToSessionのアノテーション指定方法
@org.seasar.struts.action.backport175.ExportToSession()
          ↓
@org.seasar.struts.annotation.backport175.ExportToSession