在 Spring 中忽略 JNDI 资源注入 (@Resource)

Posted

技术标签:

【中文标题】在 Spring 中忽略 JNDI 资源注入 (@Resource)【英文标题】:Ignore JNDI-Resource injection (@Resource) in Spring 【发布时间】:2019-07-29 21:37:42 【问题描述】:

我目前正在尝试使用 Spring Boot,并且正在尝试包含一个当前在 Java EE 上下文中使用的库类。 所述类有一个父类,它有一个带有 JNDI 查找名称的@Resource 注入。

在一个简化的示例中,所涉及的类如下所示:

Configuration.java

@Configuration
public class Facades 
  @Bean
  public Connection connection() 
    return new Connection();
  

  @Bean
  public Facade facade(Connection connection) 
    return new Facade(connection);
  

Facade + ParentFacade

public class ParentFacade 
  @Resource(lookup = "eis/Connection")  // <-- the problem
  protected Connection connection;


public class Facade extends ParentFacade 
  public Facade(Connection connection) 
    this.connection = connection;
  

当我运行应用程序时,出现以下错误:

在 JNDI 中定义的名称为“eis/Connection”的 bean 定义无效 环境:JNDI 查找失败;嵌套异常是 javax.naming.NoInitialContextException: 需要指定类名 环境或系统属性,或作为小程序参数,或在 应用资源文件:java.naming.factory.initial

显然,我不需要@Resource 注入,因为我可以通过构造函数注入连接。 但是,Spring 总是尝试动态注入具有 JNDI 名称的 bean。

我尝试使用以下注释从 IoC 包含中排除该类,但没有任何区别:

@Configuration
@ComponentScan(
        basePackages = "the.package",
        excludeFilters = @ComponentScan.Filter(
                type = FilterType.ASSIGNABLE_TYPE,
                classes =  Facade.class, ParentFacade.class 
        )
)

我现在的问题是: 我也可以

让 Spring 忽略有问题的类中的 @Resource 注释或 使用所需的 JNDI 名称 (eis/Connection) 注入 @Bean

提前致谢!

附: 更改包含 @Resource 注释的库类不是一种选择

【问题讨论】:

你在哪里设置你的 JNDI InitialContext?那看起来像什么? 【参考方案1】:

我想,你需要@Resource(name = "connection")

【讨论】:

这行不通 - 如果@Resource 注释将使用“名称”而不是“查找”作为参数,这将起作用。 @Resource 也使用name。你看过***.com/questions/4093504/resource-vs-autowired吗? 不幸的是,更改包含@Resource 注释的库类不是一个选项。这意味着我不能简单地将 lookup 更改为 name。我的目标是要么完全忽略 @Resource 注释,要么注入它。

以上是关于在 Spring 中忽略 JNDI 资源注入 (@Resource)的主要内容,如果未能解决你的问题,请参考以下文章

Spring注入的DataSource为空

JNDI在Spring和tomcat下的使用

Spring的注解@Qualifier用法

Spring的注解@Qualifier用法

JavaEE 资源注入

JavaEE 资源注入