読者です 読者をやめる 読者になる 読者になる

yohjizzz's Blog

I'm a Programmer.

@Resource を JDK 1.5 で利用するには…

ただの備忘録です。JDK 1.5 環境にて SAStruts を利用することになったので。


S2 や Spring など「javax.annotation」をサポートするコンテナを jdk-1-5-0_xx で利用する場合、
jdk-1-5-0_xx 環境で S2 の @Resource を利用する場合、Maven2 なら pom.xml に以下の記述でok。

  <dependency>
    <groupId>org.apache.geronimo.specs</groupId>
    <artifactId>geronimo-annotation_1.0_spec</artifactId>
    <version>1.1.1</version>
  </dependency>

ダウンロードはこちら↓から○


これで java 1.5 環境でも SAStruts を利用する際、、

    @ActionForm
    @Resource
    protected HogeForm hogeForm;

とかやれますね○

追記

これ↑だけだとやれなかった!けっきょく @Resource を指定してもインジェクションしてくれない><
ソースコードを見てみると、、
org.seasar.framework.container.factory.TigerAnnotationHandler#enableEJB3()
の中でこんなこと↓してて、

try {
    Class.forName("javax.annotation.Resource"); // geronimo-annotation_1.0_spec-1.0.jar
    Class.forName("javax.ejb.Stateless"); // geronimo-ejb_3.0_spec-1.0.jar
    Class.forName("javax.interceptor.Interceptors"); // geronimo-interceptor_3.0_spec-1.0.jar
    Class.forName("javax.persistence.PersistenceContext"); // geronimo-jpa_3.0_spec-1.0.jar
    return true;
} catch (final Throwable ignore) {
    return false;
}

org.seasar.framework.container.factory.TigerAnnotationHandler#loadDefaultPropertyDefBuilder()
の中でこんなこと↓してて、

clearPropertyDefBuilder();
propertyDefBuilders.add(new BindingPropertyDefBuilder());
if (enableEJB3) {
    propertyDefBuilders.add(new EJBPropertyDefBuilder());
    propertyDefBuilders.add(new PersistenceContextPropertyDefBuilder());
    propertyDefBuilders.add(new PersistenceUnitPropertyDefBuilder());
    propertyDefBuilders.add(new ResourcePropertyDefBuilder());
}

ここで出てくるこいつ⇒「ResourcePropertyDefBuilder」がないと、、
@Resource で指定したフィールドをインジェクション対象として見てくれないようなのです。


なので上記ソースのコメントに従い、pom.xml に以下も追加してみる。(もちろん ejbjpa は定義済みを前提○)

    <dependency>
      <groupId>org.apache.geronimo.specs</groupId>
      <artifactId>geronimo-interceptor_3.0_spec</artifactId>
      <version>1.0</version>
    </dependency>


これで結果は ok !