我有一个带有两个日期字段的XPage和一个绑定到视图的重复控件。在每个日期字段中选择日期时,我的代码会创建一个日期范围,并使用视图的“keys”参数仅返回两个日期之间视图中的文档。这非常有效。当一个导航离开视图然后返回时出现问题。我有一个pagerSaveState控件,它应该将视图恢复到导航回视图时的状态,而是发生错误:com.ibm.xsp.FacesExceptionEx: Unknown or unsupported object type in Vector
视图的XML如下所示:
<xp:this.data>
<xp:dominoView var="view1" viewName="ByDeliveryDate"
keysExactMatch="true"
keys="#{javascript:sessionScope.selectedDateRange}">
</xp:dominoView>
</xp:this.data>
创建日期范围并将其放入sessionScope变量的SSJS如下所示:
function doDateRangeSearch() {
var vValStart = @Date(getComponent('StartDate').getValue());
if(vValStart==null||vValStart=='')vValStart = @Date(@Year(@Today()),1,1,0,0,0);
var vValEnd = @Date(getComponent('EndDate').getValue());
if(vValEnd==null||vValEnd=='')vValEnd = @Today();
var vDateRange = session.createDateRange(vValStart, vValEnd);
var vDateVector:java.util.Vector = new java.util.Vector();
vDateVector.addElement(vDateRange);
if(vDateVector.isEmpty())vDateVector = null;
sessionScope.selectedStartDate = vValStart;
sessionScope.selectedEndDate = vValEnd;
sessionScope.selectedDateRange = vDateVector;
/* reset the pager to the first page because if there is only one search
* result to display and if the pager was on anything except the first
* page the search result is not displayed
*/
var pager:com.ibm.xsp.component.xp.XspPager = getComponent("pager1");
pager.gotoPage(0);
}
有谁可以告诉我为什么返回视图会导致此错误?
更新
正如Panu所建议的那样,我将以下代码添加到视图的queryOpen事件中:
print("queryOpen: opening date range view");
if(sessionScope.selectedDateRange == null){
print("selectedDateRange is null")
}else{
for (var s in sessionScope.selectedDateRange) print(s);
}
print("queryOpen: completed");
在我的网络浏览器中,我导航到了视图。视图在第一页上显示最新文档,因为这是我第一次访问此会话中的视图。这是控制台上出现的内容:
18/10/2013 10:45:23 HTTP JVM:queryOpen:开放日期范围视图
18/10/2013 10:45:23 HTTP JVM:selectedDateRange为空
18/10/2013 10:45:23 HTTP JVM:queryOpen:completed
接下来,我在两个日期字段中选择了一些日期,然后单击调用我的SSJS功能的按钮。搜索正确执行,仅显示日期范围内的文档。这是控制台上出现的内容:
18/10/2013 10:45:48 HTTP JVM:queryOpen:开放日期范围视图
18/10/2013 10:45:48 HTTP JVM:01/08/2013 00:00:00 GDT - 18/10/2013 00:00:00 GDT
18/10/2013 10:45:48 HTTP JVM:queryOpen:completed
我点击其中一个文件打开它,然后回到视图。我被显示错误页面。这是控制台上出现的内容:
18/10/2013 10:46:16 HTTP JVM:queryOpen:开放日期范围视图
18/10/2013 10:46:16 HTTP JVM:null
18/10/2013 10:46:16 HTTP JVM:queryOpen:已完成
18/10/2013 10:46:16 HTTP JVM:com.ibm.xsp.webapp.FacesServlet $ ExtendedServletException:com.ibm.xsp.FacesExceptionEx:Vector中的未知或不支持的对象类型
基于上述内容,看起来sessionScope.selectedDateRange仍然存在,但已丢失了所有内容。
答案 0 :(得分:2)
我想出了如何让它发挥作用。感谢Julian和Panu的建议。以下是我如何解决问题的方法。我在这里张贴以防万一其他人想要做类似的事情。
首先,创建一个视图,其中第一个排序列包含日期。将其设为日期/时间列。
其次,在显示视图的自定义控件上,添加两个日期字段,如下所示:
开始日期字段:
<xe:djDateTextBox
id="StartDate"
defaultValue="#{javascript:sessionScope.selectedStartDate}"
value="#{sessionScope.selectedStartDate}">
<xp:this.converter>
<xp:convertDateTime type="date"
dateStyle="full">
</xp:convertDateTime>
</xp:this.converter>
</xe:djDateTextBox>
结束日期字段:
<xe:djDateTextBox
id="EndDate"
defaultValue="#{javascript:sessionScope.selectedEndDate}"
value="#{sessionScope.selectedEndDate}">
<xp:this.converter>
<xp:convertDateTime type="date"
dateStyle="full">
</xp:convertDateTime>
</xp:this.converter>
</xe:djDateTextBox>
请注意,这些字段绑定到sessionScope变量。
第三,将数据源添加到自定义控件:
<xp:this.data>
<xp:dominoView var="view1" viewName="ByDeliveryDate"
keysExactMatch="true">
<xp:this.keys><![CDATA[#{javascript:try {
if(sessionScope.selectedStartDate == null) return;
if(sessionScope.selectedStartDate == "") return;
if(sessionScope.selectedEndDate == null) return;
if(sessionScope.selectedEndDate == "") return;
var vDateRange = session.createDateRange(sessionScope.selectedStartDate, sessionScope.selectedEndDate);
return [vDateRange]
}catch(e){
print("view filter error: " + e.toString())
}}]]></xp:this.keys>
</xp:dominoView>
</xp:this.data>
最后,添加一个除了刷新视图之外什么也不做的按钮:
<xp:button value="Go" id="FirstColumnSearchButton"
styleClass="lotusBtn goButton">
<xp:eventHandler event="onclick"
submit="false" refreshMode="partial" refreshId="viewHolder">
</xp:eventHandler>
</xp:button>
如果需要,还可以添加“重置”按钮,将视图恢复到原始状态:
<xp:button value="Reset"
id="FirstColumnSearchResetButton">
<xp:eventHandler event="onclick"
submit="false" refreshMode="partial" refreshId="viewHolder">
<xp:this.action><![CDATA[#{javascript:sessionScope.selectedStartDate = "";
sessionScope.selectedEndDate = "";}]]>
</xp:this.action>
</xp:eventHandler>
</xp:button>
请注意,它不使用我在原始问题中发布的doDateRangeSearch()
函数。
答案 1 :(得分:0)
要调试,请将此代码作为keys
参数的第一行:
print(sessionScope.selectedDateRange);
你也可以试试这些:
for (var s in sessionScope.selectedDateRange) print(s);
for (var s in sessionScope.selectedDateRange) print(typeof s);
这样,当您收到错误时,您将看到Vector中的内容。
Probabaly,DateRange已从sessionScope中消失,您需要再次将其放置在那里。如果需要,您可以将其放在keys
参数中。
<强>更新强>
当你发现你的日期范围从sessionScope消失了。这是因为DateRange
是lotus.domino
对象。它们不可序列化,不会保留在范围变量中。作为一种变通方法,您可以将日期存储到sessionScope java.util.Date
(或Calendar
),并根据每次访问该页面时创建DateRange
。