【问题标题】:Switch between JNDI names for databases in PROD and TEST在 PROD 和 TEST 中的数据库的 JNDI 名称之间切换
【发布时间】:2019-08-06 23:30:19
【问题描述】:

我正在开发一个 Maven EJB 模块。

我的 EJB 都在使用这样的持久化上下文:

@PersistenceContext(unitName = "dk.mycontext")
private EntityManager em;

效果很好。问题是当我想从测试更改为在我的应用服务器上实际部署时。

我正在使用 JUnit 在 Payara Embedded 上进行测试和运行所有测试。 Payara Embedded 使用这种格式进行 JNDI 查找(在我的 persistence.xml 文件中):

<jta-data-source>java:app/jdbc/druid</jta-data-source>

测试时发现数据源

当我将编译后的模块部署到成熟的 Payara 服务器时,它抱怨找不到数据源:

javax.naming.NameNotFoundException: No object bound to name java:app/jdbc/druid

因为它期望 JNDI 是这样的:

 jdbc/druid

这是我直接在服务器上定义 JNDI 名称的格式。问题是 - 据我所知 - payara 服务器将不接受与

java:app/jdbc/druid

至少管理界面不会验证它。

如何控制这种疯狂的行为?我不能成为第一个遇到此问题的人,但我一直无法找到解决此问题的可行解决方案。

我可以使用 Maven 来控制命名吗?

【问题讨论】:

  • 通常,通过将 JNDI 名称提取到外部配置中,而不是硬编码常量;请参阅dotenv 了解一种方法。
  • 在 persistence.xml 中将 jndi 名称设置为 maven 参数,然后创建一个发布 maven 配置文件以使用部署构建的资源过滤更改值

标签: java jakarta-ee payara payara-micro


【解决方案1】:

使用 Maven 配置文件:

persistence.xml

...
<jta-data-source>${datasource}</jta-data-source>
...

pom.xml

<properties>
    <datasource>java:app/jdbc/druid</datasource>
</properties>

<profiles>
<profile>
   <id>release</id>
   <properties>
      <datasource>jdbc/druid</datasource>
   </properties>
</profile>
</profiles>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多