JDBCConnectionManager可以与JDBCRowSet一起使用吗?

时间:2013-11-12 15:20:18

标签: xpages xpages-extlib

我正在尝试将<xe:jdbcConnectionManager><xe:jdbcRowSet>一起使用。这有用吗?这本书(XPages扩展库)似乎暗示它应该,但示例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)

EXTLIB CODE

问题似乎出现在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不为null,因为它在异常消息中被引用。根本不使用参数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直接使用时效果很好。唯一的变化是使用相同的connectionName使用对jdbcConnectionManager的引用替换该属性。该设置也与jdbcQuery数据源完美配合。

我该如何使这项工作?或者可以做到吗?

3 个答案:

答案 0 :(得分:2)

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

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

修改

要检查的一件事是SPR#MKEE86YD5L Also search for components that are within facets.不确定这是否已经修复。

答案 1 :(得分:2)

注意:我猜你知道为什么添加一个小组可以解决问题,但我会为其他可能遇到相同行为的人的利益提供更多细节。

几乎XPages中的所有内容都是按层次结构处理的。因此,变量,数据源和组件引用通常仅在容器的上下文中有效。

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

一旦完成,它就可以开始处理任何子组件,再次,在您的示例中,包括jdbcConnectionManager

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

但是数据源可以与特定的面板相关联,而不仅仅是查看根。如果您将panel作为兄弟添加到jdbcConnectionManager - 具体而言,位于下面 - 并将数据源移动到panel,那么这就是在运行时发生:

  • Domino开始处理视图根目录;现在这里没什么可做的,所以它只是把控制权交给了孩子们。
  • 第一个孩子是jdbcConnectionManager,因此在处理其余部分之前,需要对该组件进行编码。
  • 接下来,评估面板。这包括评估数据源,现在可以引用连接管理器组件,因为它已经被加载。
  • 最后,评估所有面板的后代组件(其子项,子项等)。因此,需要在此面板内的某个位置定义需要引用数据源的任何内容,但数据源可以引用连接管理器而不会特别耗尽,因为该组件不在面板中......处理小组时已经处理完毕。

答案 2 :(得分:0)

这是因为sqljdbc驱动程序的bug。代码适用于mysql。