没有调用getAsObject

时间:2012-09-27 15:33:12

标签: jsf jsf-2 converter

我想要做的是我正在使用timeMillis属性以毫秒为单位存储时间(我使用System.currentTimeMillis())并将其转换为等效的天数,小时数,分钟数和秒数从当前时间减去它。主要问题是无论何时转换器timeConverter 仅调用getAsString函数,不调用getAsObject

以下是我的xhtml文件中导致转换器无法正常运行的部分。

<c:forEach var="p" items="#{statusBean.statusList}">
    <h:form>
        <div class="status">
            <h:commandLink action="#{friendBean.gotoFriendProfile(p.email)}">
                <img src="../images/profilePicture/#{p.picture}" style="height: 29px; width: 29px; "/>
                <h:outputText value="#{p.statusBy}:"/>
            </h:commandLink>
            <h:outputText value="#{p.statusmsg}"/>
            <h:outputText value="#{p.timeMillis}">
                <f:converter converterId="timeConverter"/>
            </h:outputText>
            <br/>
            <c:forEach var="q" items="#{statusBean.commentList(p.statusId)}">
            <div class="barcomment">
                <br/>
                <h:commandLink action="#{friendBean.gotoFriendProfile(q.email)}">
                    <img src="../images/profilePicture/#{q.picture}" style="height: 29px; width: 29px; "/>
                    <h:outputText value="#{q.commentBy}:"/>
                </h:commandLink>
                <h:outputText value=" #{q.comment}"/>
            </div>
        </c:forEach>
        <br/>
        <div class="comment">
            <p:inputText value="#{statusBean.comment.comment}" styleClass="box"  />
            <p:commandLink  value="Views" action="#{statusBean.update(p.statusId)}" ajax="false" styleClass="link"/>
        </div> 

这是我写的timeConverter类。

package com.converter;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;

public class TimeConverter implements Converter {

    @Override
    public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) {
        System.out.println("inside getAsObject");
        long time=Integer.parseInt(arg2);
        long currentTime=System.currentTimeMillis();
        long eclapseTime=time-currentTime;
        long secs=eclapseTime/1000;
        long days=secs/(60*60*24);
        long hours=(secs%(60*60*24))/60*60;
        long mins=(secs%(60*60*24)%(60*60))/60;
        long secs2=(secs%(60*60*24)%(60*60)%(60));
        StringBuffer sb = new StringBuffer();
        sb.append(days).append("days").append(hours).append("hours").append(mins).append("mins").append(secs2).append("secs");
        String object1 = sb.toString();
        return object1;
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component,
            Object value) {
        System.out.println("inside getAsString");
        String value1 = value.toString();
        return value1;

    }

}

1 个答案:

答案 0 :(得分:1)

为什么这是一个问题?

您只在UIOutput组件中使用转换器:

<h:outputText value="#{p.timeMillis}">
    <f:converter converterId="timeConverter"/>
</h:outputText>

调用getAsString()Object模型值转换为String,它可以嵌入到生成的HTML输出中(你知道,你不能明白地放置Java对象)在HTML字符串中。)

但是,您无法在<h:inputText>组件String中使用它,因此无法提交Object值,需要将其转换为所需的getAsObject() 1}}在模型中,getAsObject()显然永远不会被调用。

一切都按设计工作。您的具体问题似乎是实际执行您在getAsString() @Override public String getAsString(FacesContext context, UIComponent component, Object modelValue) throws ConverterException {     // Write code here which converts the model value to display value. // This method will be used when generating HTML output. } @Override public Object getAsObject(FacesContext context, UIComponent component, String submittedValue) throws ConverterException {     // Write code here which converts the submitted value to model value.     // This method will be used when processing submitted input values. } 中执行的工作。

我认为如果你给方法一些更明智的参数名称会有所帮助:

{{1}}