0

この要件があります。シングルトン Bean があり、初期化を実行する @PostConstruct で注釈が付けられたメソッドがあります。初期化の 1 つは DB からいくつかの値を読み取ることなので、このメソッドに DB にアクセスするサービス Bean である Stateless Bean を注入したいと考えています。ステートレス Bean をシングルトン Bean のフィールドとして注入したくありません。これは、このメソッドでのみ必要なためです (シングルトン Bean の他の場所では必要ありません)。そのために、シングルトン Bean で次のように記述しました。

@Singleton
public class MySingletonBean {

    @PostConstruct
    @EJB
    public void init(SLSBService service) { /* use service to read from DB */ };
    ...
}

問題は、Singleton Bean をインスタンス化できないことです。何か案が?前もって感謝します。

4

1 に答える 1

1

@PostConstruct 注釈付き (コールバック) メソッドは、すべての参照が解決された (すべての Bean が注入された) 後に実際に呼び出されるため、この構成は機能しないと思います。

あなたができることや試してみることは、 @PostConstruct を削除し、通常のセッター注入を使用することです。ただし、他の注入されたリソースは、現時点では必ずしも解決されていないことに注意してください。

@EJB
public void setService(SLSBService service){
     service.doSmg();
}

@Stateless    
public class SLSBService{
    @PersistenceContext
    private EntityManager em;

    @TransactionAttribute(TransactionAttributeType.MANDATORY)
    public void doSmg() {
        Member member = new Member();
        member.setEmail("bla@bla.de");
        member.setName("fubu");
        member.setPhoneNumber("453454534535");
        em.persist(member);
    }
}

/* 編集 */

ちょうどそれを試すための時間がありました。メソッドはトランザクション内で実行され、EntityManager (SLBService 内) も適切に注入されるため、コンストラクトは DAO で使用できるはずです。また、予想どおり、他の EJB への参照はまだ解決されていないため、注意してください。

于 2012-01-27T13:11:12.250 に答える