2

CDI とクラスの継承に苦労しています。私は次のように宣言されたJAX-RSコントローラーを持っています:

@Path("/share")
public class ControllerShare extends BaseController {
    @Inject
    private ServiceShare serviceShare;

    @PostConstruct
    private void verifInit() throws ExceptionTechnique {
        log.warn("Checking CDI injection");
        if (serviceShare == null) {
            log.error("serviceAccount not initialized. Check your EJB configuration");
            throw new ExceptionTechnique("serviceShare not initialized. Check your EJB configuration.");
        }
    }
...
}

このコントローラーは、次のように宣言された基本コントローラーを拡張します。

public abstract class BaseController {
    private Logger log = LoggerFactory.getLogger(ControllerShare.class);

    @Context protected HttpServletRequest request;
    @Inject private ControlerSession ctrlSession;

    public BaseController() {}

    @PostConstruct
    private void verifInit() throws ExceptionTechnique {
        log.warn("Checking CDI injection");
        if (ctrlSession == null) {
            log.error("controllerSession not initialized. Check your CDI configuration");
            throw new ExceptionTechnique("serviceAccount not initialized. Check your CDI configuration.");
        }
    }
...
}

問題は、インジェクションが ControllerShare で正しく行われている (「CDI インジェクションのチェック」が正しく表示されている) ことですが、BaseController クラス (ctrlSession が null) では行われていません。@Named とその他の組み合わせを試してみましたが成功しませんでした。インジェクションは、BaseController ではなく、ControllerShare でのみ行われます。

編集: もう1つ:不思議なことに、@Contextは正常に機能しています。リクエストが設定され、値が正しい。

説明と解決策をありがとう。

4

1 に答える 1

1

実際、これは次のように機能するはずです

http://docs.jboss.org/cdi/spec/1.0/html/inheritance.html

4.2. メンバーレベルのメタデータの継承

クラス X がマネージド Bean またはセッション Bean Y の Bean クラスによって直接的または間接的に拡張されているとします。

  • X が注入されたフィールド x を宣言すると、Y は x を継承します。

余談です@PostConstructが、あらためて指定しても継承されません。したがって、サブクラスでは、両方のイニシャライザを実行するために、メソッドに別の名前を付ける必要があります。

  • X がイニシャライザ、非静的オブザーバ、@PostConstruct または @PreDestroy メソッド x() を宣言する場合、Y も、X のサブクラスで Y のスーパークラスである中間クラスもメソッドをオーバーライドしない場合に限り、Y は x() を継承します。バツ()。
于 2013-03-01T09:51:32.450 に答える