我正在为我的应用程序使用Spring Boot。我在application.properties
文件中定义了JNDI名称。
当我尝试在下面的课程中获得JdbcTemplate
时,null
:
@Configuration
public class DemoClass
{
@Autowired
private JdbcTemplate template;
@Bean
private DataSource getDS(){
return template.getDataSource(); //NPE
}
}
另一个班级
@Component
public class SecondClass {
@Autowired
private JdbcTemplate template;
public void show(){
template.getDataSource(): // Working Fine
}
}
答案 0 :(得分:1)
我不确定默认配置如果..如果不配置,那么也许您可以尝试自己配置:
@Autowired
DataSoure dataSource;
@Bean
public JdbcTemplate getJdbcTemplate() {
return new JdbcTemplate(dataSource);
}
在任何情况下,如果您只需要DataSource
,我认为它是由Spring Boot自动配置的,因此您可以在需要时直接自动装配它。
答案 1 :(得分:1)
@Repository
public class DataRepository {
private JdbcTemplate jdbcTemplate;
@Autowired
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public int updateCandidate() {
return this.jdbcTemplate.update("update .... from table where ....");
}
}
application.properties
数据库连接详情
spring.datasource.url=jdbc:oracle:thin:***
spring.datasource.username=Scott
spring.datasource.password=Tiger
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.tomcat.initial-size=1
spring.datasource.tomcat.max-active=1
spring.datasource.tomcat.min-idle=1
spring.datasource.tomcat.max-idle=1
答案 2 :(得分:1)
如果您在getDS上获得NPE。这意味着JdbcTemplate尚未注入,也许它无法注入。
通过
给出一个关于bean依赖关系的提示 @Bean
public JdbcTemplate getJdbcTemplate(DataSource dataSource){
return new JdbcTemplate(dataSource)
}
或者
@Bean
@DependsOn("template")
public DataSouce getDS(){
return template.getDataSource();
}
答案 3 :(得分:0)
默认@Autowired
设置required=true
,因此Spring不应构建DemoClass
。
您很可能正在创建new DemoClass()
或完全禁用注释配置,并且DemoClass
类已手动注册,例如使用XML。
而是确保使用Spring的组件扫描发现DemoClass
类,例如使用@SpringBootApplication
或@ComponentScan
例如根据{{3}}。