4

我正在尝试使用<xe:jdbcConnectionManager>with <xe:jdbcRowSet>。这应该工作吗?这本书(XPages Extension Library)似乎暗示它应该这样做,但示例 NSF (XPagesJDBC.nsf) 不包含任何具有该组合的示例。当然,jdbcRowSet 接受connectionManager属性。

我收到此错误:

com.ibm.xsp.FacesExceptionEx: Unknown ConnectionManager jdbcConnectionManager1
com.ibm.xsp.extlib.util.JdbcUtil.createManagedConnection(JdbcUtil.java:106)
com.ibm.xsp.extlib.jdbc.model.JdbcRowSetAccessor.findConnection(JdbcRowSetAccessor.java:467)

外部代码

问题似乎出在 JdbcUtil.java 函数 findConnectionManager() 中。它返回 null,这就是我得到上述异常的原因。这是功能:

public static IJdbcConnectionManager findConnectionManager(FacesContext context, UIComponent from, String name) throws SQLException {
    UIComponent c = FacesUtil.getComponentFor(from, name);
    if(c!=null) {
        return (IJdbcConnectionManager)c;
    }
    return null;
}

该参数name不为空,因为它在异常消息中被引用。context根本不使用该参数。并且参数from,如果为 null,则像这样获取(在第 102 行):from = context.getViewRoot();

这是抛出异常的函数:

public static Connection createManagedConnection(FacesContext context, UIComponent from, String name) throws SQLException {
    if(from==null) {
        from = context.getViewRoot(); // ROW 102
    }
    IJdbcConnectionManager manager = findConnectionManager(context, from, name);
    if(manager==null) {
        throw new FacesExceptionEx(null,"Unknown ConnectionManager {0}",name); // ROW 106
    }
    return manager.getConnection();
}

我的代码

所以,这有效:

<xp:this.data>
<xe:jdbcRowSet var="jdbcRowSet1" maxRows="10"
  sqlQuery="SELECT * FROM test.reportcode;"
  connectionName="mysql_pooled">
</xe:jdbcRowSet>
</xp:this.data>

这不起作用:

<xe:jdbcConnectionManager id="jdbcConnectionManager1"               
  connectionName="mysql_pooled">
</xe:jdbcConnectionManager>

<xp:this.data>
<xe:jdbcRowSet var="jdbcRowSet1" maxRows="10"
  sqlQuery="SELECT * FROM test.reportcode;"
  connectionManager="jdbcConnectionManager1">
</xe:jdbcRowSet>
</xp:this.data>

请注意,connectionName 是相同的,并且在 jdbcRowSet 直接使用时可以完美运行。唯一的变化是将该属性替换为使用相同连接名称的 jdbcConnectionManager 引用。该设置也与 jdbcQuery 数据源完美配合。

我怎样才能使这项工作?或者可以做到吗?

4

3 回答 3

2

计算时组件xe:jdbcConnectionManager还不存在<xp:this.data>。组件经常使用 XPage 数据源,这可能就是在创建组件之前计算数据源的原因。

您可以尝试在事件中设置connectionManager示例。afterPageLoad

编辑

要检查的一件事是SPR#MKEE86YD5L 还要搜索构面内的组件。不确定这是否已修复。

于 2013-11-12T19:03:17.400 回答
2

注意:我猜您知道为什么添加面板可以解决问题,但为了其他可能遇到相同行为的人的利益,我提供了更多详细信息。

XPages 中的几乎所有内容都是分层处理的。因此变量、数据源和组件引用通常只在容器的上下文中有效。

鉴于您在问题中列出的源代码,数据源附加到“视图根”,因此它在该页面(或自定义控件)上的任何位置都有效。由于页面在运行时被评估,根组件将首先被处理,并且评估的一部分是根据其范围确定附加到它的数据源是否需要创建或已经存在。

完成后,它可以开始处理任何子组件,在您的示例中,这些子组件包括jdbcConnectionManager.

这就是为什么,正如 Panu 所提到的,数据源不能引用组件:它附加到父组件。

但数据源可以与特定面板相关联,而不仅仅是视图根。如果您将 apanel作为兄弟添加到jdbcConnectionManager- 特别是在其下方- 并将数据源移动到 that panel,那么运行时会发生以下情况:

  • Domino 开始处理视图根;现在这里没什么可做的,所以它只是将控制权交给了它的孩子。
  • 第一个孩子是jdbcConnectionManager,因此该组件需要进行的任何编码都会在处理其余部分之前发生。
  • 接下来,评估面板。这包括评估数据源,它现在可以引用连接管理器组件,因为它已经被加载。
  • 最后,评估面板的所有后代组件(其子项、它们的子项等)。所以任何需要引用数据源的东西都需要在这个面板的某个地方定义,但是数据源可以引用连接管理器而不会特别爆炸,因为该组件不在面板内......它已经被处理了到处理小组时。
于 2013-11-14T18:23:49.257 回答
0

这是因为 sqljdbc 驱动程序错误。该代码适用于mysql。

于 2013-11-23T14:58:37.713 回答