4

私は JSF を使用しており、かなり長い間問題を抱えています。多くの場所を検索しましたが、適切な答えが見つかりませんでした。

依存性注入を抽象クラス (またはより一般的には階層の上位クラス) で機能させることはできますか? また、継承を使用する場合、注釈をどのように処理する必要がありますか? 一般的な慣行は、抽象クラスに注釈を付けず、具体的なクラスにのみ注釈を付けることであると読みましたが、その場合、その抽象クラスには注入がないことを意味しますか?

私の問題はそれです(最後のコメントを確認してください):

抽象クラス

@ManagedBean
@ViewScoped
public abstract class AbstractController<T extends VersionedObject> implements Serializable {
    @ManagedProperty("#{libraryVersionController}")
    private LibraryVersionController libraryVersionController;

public List<T> loadFromDatasource(IVersionedServiceBase<T> service) {
        log.info("Loading generic VO from data source");

        VersionedObjectFilter filter = new VersionedObjectFilter();
        filter.setSelectedLibVersion(libraryVersionController.getSelectedItem());
        // etc
    }
    // getters, setters...
}

具体的なクラス

@ManagedBean
@ViewScoped
public class DomainController extends AbstractController<Domain> implements Serializable {
private List<Domain> allItems;
   private Domain[] selectedItem;

   @ManagedProperty(value = "#{domainService}")
   private DomainService domainService;

   @PostConstruct
   public void loadFromDatasource() {
    allItems = super.loadFromDatasource(domainService);
        // !! DOES NOT WORK, null pointer exception on abstract class (libraryVersionController)
   // etc
}

ゲッターとセッターは正しく設定されています。.xhml で読み取ることができたのは、参照している具象クラス (#{domainController.allItems}) であり、@PostConstruct は 1 つしかありません。私は JSF2.1 と Mojarra を使用しています。

ご協力いただきありがとうございます !

4

1 に答える 1

0

NullPointerException に関しては、AbstractController.setLibraryVersionController が欠落していると思います。私が理解しているように、AbstractController が構築されるとき (おそらく、抽象的であっても暗黙のコンストラクターがあると思われます)、そのメソッドは適切な値を入力するために必要です。

すべてのゲッターとセッターがそこにあると言ったのは知っていますが、これはトリッキーに見えるので、見逃している可能性があります。このメソッドにロギングを追加すると、JSF が値を入力しようとしていることを確認でき、値が null かどうかも確認できます。

依存性注入が継承階層でどのように機能するかという一般的な質問については、あなたのアプローチは問題なく、依存性は基本クラスに注入され、次に派生クラスに注入されると思います。

于 2013-01-21T00:21:09.010 に答える