当前位置: 首页 > 知识库问答 >
问题:

Spring Boot-Tomcat JNDI在服务bean中失败

微生嘉祥
2023-03-14
@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
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

我想知道为什么JNDI数据源bean不能从@service class访问?有什么想法吗?

共有1个答案

从景曜
2023-03-14

实际问题是您试图在PostConstruct中获取数据源,而不是在服务bean中失败。

默认情况下,Tomcat使用线程上下文类加载器来确定应该对哪个JNDI上下文执行查找。因此,在将资源绑定到web应用程序的JNDI上下文中时,需要确保在web应用程序的类加载器(即org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedWebAppClassLoader)是线程上下文类加载器时执行查找。

下面是执行上述检查的org.apache.naming.ContextBindings.GetClassLoader的代码片段:

/**
 * Retrieves the naming context bound to a class loader.
 */
public static Context getClassLoader()
    throws NamingException {
    ClassLoader cl = Thread.currentThread().getContextClassLoader();
    Context context = null;
    do {
        context = clBindings.get(cl);
        if (context != null) {
            return context;
        }
    } while ((cl = cl.getParent()) != null);
    throw new NamingException
        (sm.getString("contextBindings.noContextBoundToCL"));
}
 类似资料:
  • 我正在尝试将一个简单的SpringBoot应用程序转换为部署在WebLogic中。它在buildin TomCat服务器上运行良好。然后对其进行更改并创建一个新的war文件。当我尝试部署war文件时,我得到这个错误。 web.xml的Servlet初始值设定项 application.java文件

  • 我有一个SpringBoot应用程序,它有一个控制器类、一个服务和一个存储库,运行得非常好。我已经为相同的应用程序添加了Junit测试用例,而且效果也非常好。 下面是测试类。 测试用例一直通过,但目前我正在添加另一个API,如下所示,所有测试都失败了。 下面是测试类。 添加部门服务后,测试用例失败,错误如下: 干杯!

  • 服务调用失败 KernalEvent::SERVICE_FAIL事件 在框架层,调用servcie时,会抛出KernalEvent::SERVICE_FAIL事件,你可以监听该事件,做数据上报处理,请以异步方式上报 配置config/lister.php中的事件监听器 示例 <?php namespace src\Web\Listeners; class ServiceFailListener e

  • 我有一个DTO,它在控制器层通过BeanValidation(javax.validation)和定制验证器(org.springframework.validation.Validator)的组合进行验证。通过这种方式,我可以检查提供的输入是否有效,然后转换实体中的DTO并将其转发到服务层。 然后是业务逻辑验证。例如:@Entity用户的startDate必须在某个事件发生之后,如果最后创建的用

  • 下午好 我在Bean Validator(JSR 303)中注入服务时遇到问题。我将执行验证,但我需要在数据库中验证此记录; 当我使用我的服务时,它会抛出NullPointerException; 例外: 注释: ValidatorImpl:

  • 我正在尝试创建一个简单的eureka服务和客户端程序,并在其上启用hystrix。但我在代码上发现了这个错误