我正在尝试按日期和用户ID过滤listPage。从数据表中,选定的用户标识和日期值将使用f:param标记传递给listPage。列表页面显示错误,指出“值必须是日期”,并且过滤器不起作用。它只是在没有日期的情况下由userid过滤。我能做错什么?或者我怎样才能让它发挥作用?我也尝试过使用不起作用的JBoss接缝日期转换器。
继承我的代码:
firstPage.xhtml
<h:column>
<f:facet name="header">Date</f:facet>
<h:outputText value="#{_auditEventFact[3]}">
</h:outputText>
</h:column>
<rich:column styleClass="action">
<f:facet name="header">Action</f:facet>
<s:link value="View" view="/AuditEventFactList.xhtml" action="# auditEventFactList.lookUpUserAuditRecords()}">
<f:param name="userid" value="#{_auditEventFact[1]}"/>
<f:param name="ntimestamp" value="#{_auditEventFact[3]}"/>
</s:link>
</rich:column>
pages.xml中
<param name="from"/>
<param name="userid" value="#{auditEventFactList.auditEventFact.userid}"/>
<param name="ntimestamp" value="#{auditEventFactList.auditEventFact.ntimestamp}" converterId="javax.faces.DateTime"/>
ListAction.java
private static final String EJBQL = "select auditEventFact from AuditEventFact auditEventFact";
private static final String[] RESTRICTIONS = {
"lower(auditEventFact.userid) like concat(lower(#{auditEventFactList.auditEventFact.userid}),'%')",
"auditEventFact.ntimestamp = #{auditEventFactList.auditEventFact.ntimestamp}",
"lower(auditEventFact.auditid) like concat(lower(#{auditEventFactList.auditEventFact.auditid}),'%')", };
private AuditEventFact auditEventFact = new AuditEventFact();
public AuditEventFactList() {
setEjbql(EJBQL);
setRestrictionExpressionStrings(Arrays.asList(RESTRICTIONS));
setMaxResults(25);
}
EntityBean.java
@Temporal(TemporalType.TIMESTAMP)
@Column(name="NTIMESTAMP#", length=11)
public Date getNtimestamp() {
return this.ntimestamp1;
}
public void setNtimestamp(Date ntimestamp1) {
this.ntimestamp1 = ntimestamp1;
}
答案 0 :(得分:3)
我不做Seam,所以我无法给出以Seam为目标的答案。但基本上,f:param
设置一个HTTP请求参数,该参数只能包含字符串,因为它们按照HTTP规范以ASCII风格传输。它没有像您期望的那样作为一个值得信赖的java.util.Date
对象传递。相反,String.valueOf(date)
的结果已通过。其格式在Date#toString()
中指定。
在简单的JSF术语中,有两种解决方案:
使用<h:commandLink>
代替f:setPropertyActionListener
,它能够“传递”完整的非标准Java对象作为“参数”。
<h:commandLink value="View" action="#{auditEventFactList.lookUpUserAuditRecords}">
<f:setPropertyActionListener target="#{entityBean.ntimestamp}" value="#{_auditEventFact[3]}"/>
</h:commandLink>
在String
中使用Date
代替ntimestamp
或在其周围包含另一个String
设置器,将String
转换为Date
并委托原始的Date
二传手。 java.text.SimpleDateFormat
可能对此有所帮助。
看看这是否可以与Seam结合使用。
答案 1 :(得分:0)
您可以在参数上使用<s:convertDateTime />
标记吗?我自己从未尝试过,但值得一试。