在 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)的主要内容,如果未能解决你的问题,请参考以下文章