15

@Value アノテーションを使用してプロパティ ファイルから値を挿入しようとしている抽象クラスがあります。

public abstract class Parent {
     @Value ("${shared.val}")
     private String sharedVal;

     public Parent() {
        //perform common action using sharedVal
     }

}

@Component
public class ChildA extends Parent {
     Param a1;
     @Autowired
     public ChildA (Param a1) {
        super();
        this.a1 = a1;
     }
}

sharedVal が設定されていないため、NullPointerException が発生しています。抽象クラスに @Component ステレオタイプを追加しようとしましたが、それでも同じです。

この方法で抽象クラスに値を注入できますか? そうでない場合、どうすればこれを達成できますか?

4

2 に答える 2

5

この方法で抽象クラスに値を注入できますか?

抽象クラスはインスタンス化できないため、抽象クラスには何も注入できません。代わりに、具体的なサブクラスに値を注入する必要があります。

@Component具象サブクラスがステレオタイプとしてマークされ、Spring によって「コンポーネントスキャン」されていることを確認してください。@Componentインスタンス化できないため、抽象クラスでは必要ありません。


更新:コンストラクター内で注入された値にアクセスしようとしていることが最終的にわかりましたが、値が設定されていないことがわかりました。これは、Bean がインスタンス化された後に Spring が値を注入するためです。したがって、コンストラクター注入が使用されない場合、注入された値はコンストラクター内でアクセスできません。Matt の提案に従って、使用@PostContructまたは実装できます。InitializingBean

以下は、XML 構成が使用されているかどうかを示しています。

<context:property-placeholder location="classpath:xxxxx.properties" ignore-unresolvable="true" />


<bean id="parent" class="pkg.Parent" abstract="true" init-method="postConstruct">
    <property name="sharedVal" value="${shared.val}" />
</bean>


<bean id="child" class="pkg.ChildA" parent="parent">

sharedVal内部を使用して一般的なアクションを実行しますParent#postConstruct()

于 2013-07-31T04:07:38.190 に答える