Xpages JDBCConnectionManager可以与JDBCRowSet一起使用吗?
我正在尝试将Xpages JDBCConnectionManager可以与JDBCRowSet一起使用吗?,xpages,xpages-extlib,Xpages,Xpages Extlib,我正在尝试将与一起使用。这样行吗?这本书(XPages扩展库)似乎暗示它应该这样做,但是示例NSF(XPagesJDBC.NSF)不包含任何具有这种组合的示例。当然,jdbcRowSet接受connectionManager属性 我得到这个错误: com.ibm.xsp.FacesExceptionEx: Unknown ConnectionManager jdbcConnectionManager1 com.ibm.xsp.extlib.util.JdbcUtil.createManagedC
与
一起使用。这样行吗?这本书(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代码
问题似乎出在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
不为空,因为它在异常消息中被引用。根本不使用参数上下文
。并且参数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数据源完美配合使用
我怎样才能做到这一点?或者可以这样做吗?当计算
时,组件xe:jdbconnectionmanager
还不存在。组件通常使用XPage数据源,这可能就是为什么在创建组件之前计算数据源的原因
您可以尝试在afterPageLoad
事件中设置connectionManager
编辑
需要检查的一件事是,不确定是否已修复此问题。注意:我猜您知道为什么添加面板可以修复此问题,但为了其他可能遇到相同行为的人的利益,我提供了额外的细节
XPages中的几乎所有内容都是分层处理的。因此,变量、数据源和组件引用通常仅在容器的上下文中有效
根据问题中列出的源代码,数据源附加到“视图根目录”,因此它在该页面的任何位置(或自定义控件)都有效。在运行时对页面进行评估时,将首先处理根组件,评估的一部分是根据其范围确定附加到该页面的数据源是否需要创建或已经存在
一旦完成,它就可以开始处理任何子组件,在您的示例中,它同样包括jdbcConnectionManager
这就是为什么,正如Panu提到的,数据源不能引用组件:它附加到父级
但数据源可以与特定面板相关联,而不仅仅是视图根。如果将面板
添加为jdbcConnectionManager
的同级,特别是在其下方,并将数据源移动到该面板
,则在运行时会发生以下情况:
- Domino开始处理视图根目录;现在这里没什么可做的,所以它把控制权交给了它的孩子
- 第一个子组件是
jdbcConnectionManager
,因此该组件需要进行的任何编码都会在处理其余组件之前进行
- 接下来,对面板进行评估。这包括评估数据源,该数据源现在可以引用连接管理器组件,因为它已经加载
- 最后,将评估面板的所有子体组件(其子级、子级等)。因此,需要引用数据源的任何内容都需要在该面板内的某个位置定义,但是数据源可以引用连接管理器,而无需特别爆破,因为该组件不在该面板内。。。在处理小组的时候,它已经被处理好了
这是因为sqljdbc驱动程序错误。代码在mysql上运行良好。在xe:jdbcRowSet中,您是否尝试绑定connectionManager=“#{JDBCConnectionManager}”?@Frantisek,这会产生错误:“未提供连接管理器、JNDI名称或url”。xsp配置中属性的
定义为java.lang.String。上面的函数createManagedConnection()
仅在以下情况下调用:if(StringUtil.isNotEmpty(connectionManager))
。我的想法是启动绑定以“强制”创建bean。该属性需要变量名(正如您在源代码中指出的那样),因此它不起作用。另一个想法是:在faces配置中定义bean,而不是在XP/CC源代码中。更复杂一点,但我会不惜一切代价避免使用“on/before/after”脚本帮助程序。您是否尝试过将数据源移动到内部面板?@Tim:使用额外的
确实可以工作。谢谢,如果你发表一篇文章,我会接受这个答案。这似乎确实是一个时间问题(见上面@Tim的评论)。顺便说一句,setConnectionManager()
函数不起作用(它只是字符串属性的一个setter)。哦,不幸的是,我找不到SPR:(jdbcRowSet
是数据源,那么您的意思是jdbcConnectionManager
?这是一个非常清楚的解释,谢谢。但是,我不明白为什么设置使用jdbcQuery
数据源。它们的初始化过程一定有一些不同(惰性与直接风格)。这也是我的猜测。由于这些数据源是扩展库的一部分,如果您真的想知道它们在幕后的行为,可以打开源代码。:)