Выдать тип даты прохождения с помощью f: param - PullRequest
1 голос
/ 20 августа 2010

Я пытаюсь отфильтровать 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>

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;
    }

Ответы [ 2 ]

3 голосов
/ 21 августа 2010

Я не делаю 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 может быть полезным в этом.

Проверьте, выполнимо ли это в сочетании со Швом.

0 голосов
/ 23 августа 2010

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

...