【发布时间】:2014-12-04 08:35:31
【问题描述】:
我正在尝试在 Spring Boot 1.1.6 Web 项目中将数据源从 c3p0 切换到 Tomcat JNDI。我在GitHub 中找到了一个示例应用程序,当从@RestController 带注释的类访问DataSource 实例时,它可以正常工作。
@RestController
public class TestController {
@Autowired
private DataSource dataSource;
@RequestMapping("/test")
@ResponseBody
public String test() {
// Gets object instance... everything is OK...
System.out.println(this.dataSource);
}
但是,当我尝试将相同的数据源注入 @Service 带注释的 bean 时,只要在代码中使用实例,我就会得到 javax.naming.NameNotFoundException。
@Service
public class TestService {
@Autowired
private DataSource dataSource;
@PostConstruct
private void init() {
// Throws exception...
System.out.println(this.dataSource);
}
堆栈跟踪:
Caused by: javax.naming.NameNotFoundException: Name [java:comp/env/jdbc/myDataSource] is not bound in this Context. Unable to find [java:comp].
at org.apache.naming.NamingContext.lookup(NamingContext.java:819)
at org.apache.naming.NamingContext.lookup(NamingContext.java:167)
at javax.naming.InitialContext.lookup(InitialContext.java:411)
at org.springframework.jndi.JndiTemplate$1.doInContext(JndiTemplate.java:155)
at org.springframework.jndi.JndiTemplate.execute(JndiTemplate.java:87)
at org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:152)
at org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:179)
at org.springframework.jndi.JndiLocatorSupport.lookup(JndiLocatorSupport.java:95)
at org.springframework.jndi.JndiObjectLocator.lookup(JndiObjectLocator.java:106)
at org.springframework.jndi.JndiObjectTargetSource.getTarget(JndiObjectTargetSource.java:135)
... 11 more
我想知道为什么无法从@Service 类访问 JNDI 数据源 bean?有什么想法吗?
【问题讨论】:
-
你是如何指定容器拾取@Service注解的?
-
应用上下文启动时实例化一次。
-
您确定 DI 容器会接收到它吗?你在使用组件扫描吗?
-
是的,主类用
@ComponentScan注解。 -
你是如何配置 jndi 模板和数据源 bean 的?