Quarkus 如何指定 JNDI 数据源
Quarkus How to Specify JNDI Datasources
我正在评估 Quakus 作为 Tomcat 环境的替代品。我了解我正在尝试做的事情的挑战,但我首先需要验证我现有的遗留 JSP 应用程序是否可以使用 Quarkus。我正在使用 quarkus.undertow 作为我的 servlet 容器。
到目前为止,我已经克服了几个障碍。我现在 运行 感兴趣的是如何使用我的数据源。
目前,我们的数据源在 Tomcat 的 server.xml 中设置为 GlobalNamingResources,并将它们绑定到网络应用程序的 META-INF/context。xml 中作为 ResourceLinks。
我已经将数据源设置转移到 Quarkus 的 application.properties 中:
quarkus.datasource.menudb.url=jdbc:mysql://some.server.url/menuadmin
quarkus.datasource.menudb.driver=com.mysql.cj.jdbc.Driver
quarkus.datasource.menudb.username=web
quarkus.datasource.menudb.password=<password>
据我所知,从文档中可以看出,这是做到这一点的方法。但是,文档随后显示注入数据源:
@Inject
@DataSource("users")
AgroalDataSource dataSource1;
在我的例子中,我会在注释中用我的数据源名称 menudb
替换 users
。但是,我有数据访问权限 类 我需要能够重用创建 InitialContext、使用传入的 JNDI 资源名称查找数据源并创建数据源:
InitialContext ic = new InitialContext();
DataSource ds = (DataSource)ic.lookup("java:comp/env/<jndi name>");
conn = ds.getConnection();
这导致了以下错误:
javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:662)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:313)
at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:350)
at javax.naming.InitialContext.lookup(InitialContext.java:417)
at com.gy.obj.ContextManager.contextInitialized(ContextManager.java:367)
at io.undertow.servlet.core.ApplicationListeners.contextInitialized(ApplicationListeners.java:188)
...
初步研究让我想到了 Apache Camel,但乍一看,这似乎不是一个合适的解决方案。我还阅读了有关设置 jndi.properties 的信息:
# Needed env settings for JNDI.
java.naming.factory.initial=<Some JNDI Service Provider Name>
但我不确定要使用哪个提供商,而且截至目前似乎无法找到有关各种提供商的文档。
我的问题是,我至少走在正确的轨道上吗?我会使用哪个提供商?如果我没有的话,我真的不想触及我现有的数据访问 类 来提供注入。但是,我不反对我们目前为 Tomcat.
配置的作品。
有意不支持 JNDI,因为我们认为它是一种不必要的复杂性,在 Quarkus 模型中没有用处:没有运行时部署,所有代码在构建时都是已知的,因此不需要这种解耦。
解决方案很简单:只需调整代码,使其不从 JDNI 上下文中查找,而是从 CDI bean 管理器中查找。
虽然我们能够支持大多数高级 API,但移植现有应用程序应该很容易,但不要假设会提供所有遗留技术 - 现在是摆脱一些并继续前进的好时机.
也就是说我认为 JNDI 可以很容易地被模拟,但到目前为止我们宁愿避免这种情况;如果这对您很重要,请随时提出问题。
我正在评估 Quakus 作为 Tomcat 环境的替代品。我了解我正在尝试做的事情的挑战,但我首先需要验证我现有的遗留 JSP 应用程序是否可以使用 Quarkus。我正在使用 quarkus.undertow 作为我的 servlet 容器。
到目前为止,我已经克服了几个障碍。我现在 运行 感兴趣的是如何使用我的数据源。
目前,我们的数据源在 Tomcat 的 server.xml 中设置为 GlobalNamingResources,并将它们绑定到网络应用程序的 META-INF/context。xml 中作为 ResourceLinks。
我已经将数据源设置转移到 Quarkus 的 application.properties 中:
quarkus.datasource.menudb.url=jdbc:mysql://some.server.url/menuadmin
quarkus.datasource.menudb.driver=com.mysql.cj.jdbc.Driver
quarkus.datasource.menudb.username=web
quarkus.datasource.menudb.password=<password>
据我所知,从文档中可以看出,这是做到这一点的方法。但是,文档随后显示注入数据源:
@Inject
@DataSource("users")
AgroalDataSource dataSource1;
在我的例子中,我会在注释中用我的数据源名称 menudb
替换 users
。但是,我有数据访问权限 类 我需要能够重用创建 InitialContext、使用传入的 JNDI 资源名称查找数据源并创建数据源:
InitialContext ic = new InitialContext();
DataSource ds = (DataSource)ic.lookup("java:comp/env/<jndi name>");
conn = ds.getConnection();
这导致了以下错误:
javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:662)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:313)
at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:350)
at javax.naming.InitialContext.lookup(InitialContext.java:417)
at com.gy.obj.ContextManager.contextInitialized(ContextManager.java:367)
at io.undertow.servlet.core.ApplicationListeners.contextInitialized(ApplicationListeners.java:188)
...
初步研究让我想到了 Apache Camel,但乍一看,这似乎不是一个合适的解决方案。我还阅读了有关设置 jndi.properties 的信息:
# Needed env settings for JNDI.
java.naming.factory.initial=<Some JNDI Service Provider Name>
但我不确定要使用哪个提供商,而且截至目前似乎无法找到有关各种提供商的文档。
我的问题是,我至少走在正确的轨道上吗?我会使用哪个提供商?如果我没有的话,我真的不想触及我现有的数据访问 类 来提供注入。但是,我不反对我们目前为 Tomcat.
配置的作品。有意不支持 JNDI,因为我们认为它是一种不必要的复杂性,在 Quarkus 模型中没有用处:没有运行时部署,所有代码在构建时都是已知的,因此不需要这种解耦。
解决方案很简单:只需调整代码,使其不从 JDNI 上下文中查找,而是从 CDI bean 管理器中查找。
虽然我们能够支持大多数高级 API,但移植现有应用程序应该很容易,但不要假设会提供所有遗留技术 - 现在是摆脱一些并继续前进的好时机.
也就是说我认为 JNDI 可以很容易地被模拟,但到目前为止我们宁愿避免这种情况;如果这对您很重要,请随时提出问题。