Выдать тип передачи даты с помощью f:param

Я пытаюсь отфильтровать listPage по дате и идентификатору пользователя. Из таблицы данных выбранный идентификатор пользователя и значение даты передаются в listPage с тегом f:param. На странице списка отображается ошибка «значение должно быть датой», и фильтр не работает. Это работает, если его просто отфильтровать по идентификатору пользователя без даты. Что я могу делать неправильно? или Как я могу заставить это работать? Я также пытался использовать конвертер даты шва 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>

страницы.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;
    }

person John    schedule 20.08.2010    source источник


Ответы (2)


Я не занимаюсь Seam, поэтому не могу дать ответ, ориентированный на Seam. Но в основном f:param устанавливает параметр HTTP-запроса, который может содержать только строки, поскольку они передаются в формате ASCII в соответствии со спецификацией HTTP. Он не был передан как полноценный объект java.util.Date, как вы ожидаете. Вместо этого результат String.valueOf(date) был передан. Его формат указан в Date#toString() .

Говоря простым языком JSF, есть два решения:

  1. Вместо этого используйте <h:commandLink> в сочетании с f:setPropertyActionListener, он способен «передавать» полноценные нестандартные объекты Java в качестве «параметров».

    <h:commandLink value="View" action="#{auditEventFactList.lookUpUserAuditRecords}">
        <f:setPropertyActionListener target="#{entityBean.ntimestamp}" value="#{_auditEventFact[3]}"/>
    </h:commandLink>
    
  2. Используйте String вместо Date в ntimestamp или оберните другой сеттер String вокруг него, который преобразует String в Date и делегирует исходный сеттер Date. В этом может помочь java.text.SimpleDateFormat.

Посмотрите, возможно ли это в сочетании с Seam.

person BalusC    schedule 21.08.2010

Можно ли использовать тег <s:convertDateTime /> для параметра? Я никогда не пробовал это сам, но это стоит посмотреть.

person Shadowman    schedule 23.08.2010