【问题标题】:Accessing JNDI with Play 2.2使用 Play 2.2 访问 JNDI
【发布时间】:2014-10-01 17:02:39
【问题描述】:

我正在尝试通过以下方式访问 Tomcat server.xml 和 context.xml 中指定的数据源 玩。 playapplication 位于 tomcat webapps 中的 war 中,并且其 web.xml 中的 Connection 指定为:

  <resource-ref>
      <description>DB Connection</description>
      <res-ref-name>jdbc/Testconnection</res-ref-name>
      <res-type>javax.sql.DataSource</res-type>
      <res-auth>Container</res-auth>
  </resource-ref>

为了查看指定的连接,我使用了一个 jsp 来检查配置:

Context initialContext = new InitialContext();
Context componentBindings = (Context) initialContext.lookup("java:comp/env");
DataSource dataSource = (DataSource) componentBindings.lookup("jdbc/Testconnection");
Connection connection = dataSource.getConnection();
String connectionUrl = connection.getMetaData().getURL();
out.println(connectionUrl);

这显示了预期的结果。 当尝试访问 play 应用程序中的数据库时,它总是会导致: “找不到 .... 的数据源:路径表达式中不允许使用令牌:'-'”指向我的 play 应用中包含 DB.withConnection 的行。

所以让我感到困惑的是,在我的整个代码中没有像“-”这样的标记。

我尝试访问以下组合:

DB.withConnection("java:comp/env/jdbc/Testconnection") { imlicit c => .......}

DB.withConnection("java:jdbc/Testconnection") { imlicit c => .......}

DB.withConnection("jdbc/Testconnection") { imlicit c => .......}

如果有人可以为我提供解决方案或指出正确的方向,那就太好了。

非常感谢!

解决方案:


所以解决方案(感谢 applicius!)可能是:

导入 javax.naming.{Context, InitialContext}

导入 javax.sql.DataSource

[...]

var conn: java.sql.Connection = (new InitialContext).lookup("java:/comp/env").asInstanceOf[Context].lookup("jdbc/Testconnection").asInstanceOf[DataSource].getConnection

val 结果:Option[Result] = SQL(queryName).on(("variable","re​​placeValue")).singleOpt(Result.rowMapper)(conn)

[...]

【问题讨论】:

  • 哪里来的错误could not find datasource for ....: Token not allowed in path expression: '-'? JSP?你的withConnection 测试(顺便说一句/imlicit/implicit)?
  • 抱歉,我对此不清楚。编辑了我原来的帖子。错误来自播放应用程序本身指向DB.withConnection

标签: scala jndi playframework-2.2


【解决方案1】:

Play DB API 需要一个 Play 数据源名称(对应于 Play application.conf 中的条目),而不是 JNDI 名称。

您可以使用常规 JNDI 查找自行获得连接并在 Play 应用中使用它(必须自行发布),或者您将数据源设置移动/复制到 Play 配置中。

【讨论】:

  • 非常感谢您的回答。您能否对常规 JNDI 查找更具体一点?因为不幸的是,将连接复制为 application.conf 中的条目不是我的选择。
  • 常规 JNDI 查找 = 与您在 vanilla Java 代码中所做的相同(如在您的测试 JSP 中:从 JNDI 上下文中获取 javax.sql.DataSource,从那里获取 java.sql.Connection。(顺便说一句,我建议您提交在 Playframework GitHub repo 上拉取请求,请求一些基于 JNDI 的 DBPlugin)。
  • 感谢applicius,为您提供帮助!
  • 我认为 JNDI DBPlugin 可以遵循这一点 --> github.com/playframework/playframework/pull/…
猜你喜欢
  • 2014-07-30
  • 1970-01-01
  • 1970-01-01
  • 2013-11-06
  • 1970-01-01
  • 2013-10-24
  • 2013-09-27
  • 2013-06-26
  • 1970-01-01
相关资源
最近更新 更多