【问题标题】:Ignore JNDI-Resource injection (@Resource) in Spring在 Spring 中忽略 JNDI 资源注入 (@Resource)
【发布时间】: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?那看起来像什么?

标签: spring spring-boot jndi


【解决方案1】:

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

【讨论】:

  • 这行不通 - 如果@Resource 注释将使用“名称”而不是“查找”作为参数,这将起作用。
  • @Resource 也使用name。你看过stackoverflow.com/questions/4093504/resource-vs-autowired吗?
  • 不幸的是,更改包含@Resource 注释的库类不是一个选项。这意味着我不能简单地将 lookup 更改为 name。我的目标是要么完全忽略 @Resource 注释,要么注入它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-15
  • 1970-01-01
  • 1970-01-01
  • 2016-07-12
  • 1970-01-01
  • 2011-02-24
  • 1970-01-01
相关资源
最近更新 更多