我需要关于依赖注入的帮助。
我有一个bean类,它有一个JdbcTemplate的对象引用,我正在使用@Autowired
来
创建该对象的实例。但是该对象没有被加载,因此抛出了NullPointerException
来自setCustName()方法。
请帮忙
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)
答案 0 :(得分:1)
你得到NullPointerException,因为jdbcTemplate为null /未注入。
如果用xml描述bean custBean,就像你一样,你应该添加: &LT; property name =“jdbcTemplate”value =“myjdbcTemplate”/&gt;用于将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:
class 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>
答案 1 :(得分:1)
在bean上添加上面的@Component注释后,我们需要告诉spring扫描这些相应的bean并加载所有自动连接的依赖项。这可以通过声明以下XML配置
来完成 <context:component-scan base-packages="<your_package_names>"/>
例如,如果我的包结构是com.mycompany
<context:component-scan base-packages="com.mycompany"/>
答案 2 :(得分:0)
使用<context:annotation-config>
可以在bean类中使用不同的注释。
另外,我强烈建议不要在属性设置器中使用不同的依赖项。在你的代码示例中,你假设在调用setter之前jdbcTemplate是自动装配的,事实上你无法确定。
因此,您在setter中放置的关于jdbc模板的逻辑将更适合放置在使用@PostConstruct注释的方法中。