2017-07-06 7 views
1

依存性注入に関して助けが必要です。Beanインスタンスがロードされていません

JdbcTemplateのオブジェクト参照を持つBeanクラスがあり、そのオブジェクトのインスタンスをから に作成しています。しかし、そのオブジェクトはロードされておらず、その結果、setCustName()メソッドからNullPointerExceptionがスローされます。

Beanクラスを助けてください:

class CustomerBean { 

    private String custName; 

    @Autowired 
    private JdbcTemplate jdbcTemplate; 

    public void setCustName(String custName) { 
    this.custName = custName; 
    jdbcTemplate.update(query); 
    } 
} 

XML:

<bean id="myjdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> 
     <property name="dataSource" ref="dataSource" /> 
</bean> 

<bean id="custBean" class="com.test.CustomerBean"> 
     <property name="custName" value="John" /> 
</bean> 

スタックトレース:

PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'custName' threw exception; nested exception is java.lang.NullPointerException 
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:334) 
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:108) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1419) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1160) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:293) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223) 
+1

あなたのコードのどこかで、あなたは 'CustomerBean'のインスタンスを取得していますか?どこかで 'new CustomerBean()'をやっていますか?そうすればうまくいきません。あなたはSpringがSpring beanの作成を管理できるようにする必要があります。Springは自動的に 'new'を使って自分自身をインスタンス化するオブジェクトへの依存関係を注入できません。 – Jesper

+0

@Jesperご返信ありがとうございます。私はどこでも 'CustomerBean'のインスタンスを作成していません – Rehman

+0

あなたのコードのどこかで、' setCustName'メソッドを呼び出す 'CustomerBean'のインスタンスを取得していなければなりません。そのコードはどこから 'CustomerBean'のインスタンスを取得しますか? – Jesper

答えて

1

あなたはNullPoinを取得jdbcTemplateがnull /注入されていないためのterException

あなたがXMLで豆custBeanを記述する場合、あなたがしたように、あなたが追加する必要があります: <プロパティ名= "jdbcTemplate" 値= "myjdbcTemplate" />注入jdbcTemplateのためのあなたのBeanに。

xmlと注釈が混在しています。あなたのxmlには:

<context:component-scan base-package="package....." /> 

サポートする@AutowiredとCustomerBeanは@serviceまたは@componentにする必要があります。


vaiant1:

XMLに追加し

@Component 
class CustomerBean { 

    private String custName; 

    @Autowired 
    private JdbcTemplate jdbcTemplate; 

    public void setCustName(String custName) { 
     this.custName = custName; 
     jdbcTemplate.update(query); 
    } 
} 

variant2:

クラスCustomerBean {

private String custName; 
private JdbcTemplate jdbcTemplate; 

public void setJdbcTemplate(JdbcTemplate jdbcTemplate){ 
    this.jdbcTemplate = jdbcTemplate; 
} 

public void setCustName(String custName) { 
    this.custName = custName; 
    jdbcTemplate.update(query); 
} 

}

およびXML

<bean id="custBean" class="com.test.CustomerBean"> 
     <property name="custName" value="John" /> 
     <property name="jdbcTemplate" ref="myjdbcTemplate" /> 
</bean> 
+0

'@Autowired'を使用しているので、なぜ 'jdbcTemplate'に' 'を追加する必要がありますか? – Rehman

+0

1.コンポーネントスキャンのコンテキストがありますか? @custBeanは、@ component/@ serviceという注釈がないので、autoscanのコンポーネントではありません。 3あなたはxmlによって構成されている、これのための@Autowiredはありません。あなたは構成を混在させます。 xmlまたはannotationによって作成または記述されました – xyz

+0

デバッグしようとしましたが、コールjdbcTemplate.update(query)のsetCustNameメソッドで例外が表示されます。 – xyz

1
  1. autowiredことができる豆を含有するBeanクラスに@Componentアノテーションを追加します。
  2. 上記の@ComponentアノテーションをBeanに追加した後で、springにそれぞれのBeanをスキャンし、すべてのautowired依存関係をロードするように指示する必要があります。これは私のパッケージ構造は、COMの場合は、次のXMLconfiguration

    例えば

    <context:component-scan base-packages="<your_package_names>"/>

    を宣言することによって行うことができます。Beanクラス内の別の注釈の使用を可能にmycompanyの

    <context:component-scan base-packages="com.mycompany"/>

0

使用<context:annotation-config>

また、プロパティセッターでは依存関係の異なる使用を強くお勧めします。コードサンプルでは、​​setterの呼び出しの前にjdbcTemplateがオートワイヤードされていることを前提としています。

したがって、jdbcテンプレートに関する設定者のロジックは、@ PostConstructでアノテーションされたメソッドに適切に配置されます。

関連する問題