0

注釈 ( ) を持つスーパークラス@Resourceがあり、そのスーパークラスを拡張するサブクラスがステートレス Bean であるという問題があります。

これとよく似ていますが、スーパークラスとサブクラスが同じモジュールにある場合、リソースは正常に注入されます。それらが別々のモジュールにある場合、リソースは注入されません - 注釈が処理されないようです。

クラスで注釈が「見える」ことをリフレクションで確認しましたが、 にステップインするとResourceInjectionAnnotationParsingProcessor@Resource注釈は他のモジュールから継承するクラスには表示されません (同じモジュール内にあるクラスには表示されますが) )。

私が見てきた一般的な解決策jandexはファイルとセットですannotations="true"が、これは静的モジュール用であり、私たちの場合のような他の展開ではないようです。

もう1 つの提案は、モジュールがアノテーションへの依存関係を欠いている可能性があるというものでしたが、私の例では、関連するすべてのモジュールが に依存していました<module name="javax.annotation.api"/>

これらの注釈を個別の展開から「見える」ようにする他の方法はありますか?

最小限の例として、スーパークラスがある場合

import javax.annotation.Resource;
import javax.ejb.SessionContext;

public class BaseResource {
  @Resource
  private SessionContext sessionContext;

  public String getContext() {
    return "Context is " + sessionContext;
  }
}

とのサブクラス

import javax.ejb.Stateless;

@Stateless
public class ResourceBean extends BaseResource {
  public ResourceBean() {
    System.out.println(getClass().getName() + " created");
  }
}

これらが同じモジュール内にある場合は、SessionContextが表示されます。個別のモジュールでSessionContextは、常にnullです。

4

1 に答える 1

0

回避策としてを調べることができますSessionContext。これはあなたの問題に対する答えではありませんが、少なくとも SessionContext にアクセスできます。

  public SessionContext getSessionContext()
  {
    try
    {
      InitialContext ic = new InitialContext();
      return (SessionContext) ic.lookup("java:comp/EJBContext");
    }
    catch (NamingException ex)
    {
      // handle exception
    }
    return null;
  }

抜粋: http://javahowto.blogspot.com/2006/06/4-ways-to-get-ejbcontext-in-ejb-3.html

于 2015-05-15T11:11:57.567 に答える