JSF转换器:验证错误:值无效

时间:2013-03-05 20:13:11

标签: java jsf-2 primefaces

全部,

我一直在阅读和搜索,虽然它上面有几个,但似乎我遗漏了一些东西。 我的表单在转换selectOneListBox

时仍然失败

我已阅读并搜索过,但到目前为止,我还没有找到导致此问题的原因。 据我所知,可能的原因如下:

  1. Object.equals()不正确
  2. 菜单列表为空。
  3. Inline是我的基于Users类的转换器:

    @FacesConverter("misc.util.UserConverter")
    public class UserConverter implements Converter {
        private static HashMap<String, Users> map = new HashMap<String, Users>();
        @Override
        public Object getAsObject(FacesContext context, UIComponent component, String value) {
            Users user = map.get(value);
            Logger.getGlobal().log(Level.INFO, "UserConverter - getAsObject " + user.getEmail());
            Logger.getGlobal().log(Level.INFO, "UserConverter - getAsObject value " + value);
            return user;
        }
    
        @Override
        public String getAsString(FacesContext context, UIComponent component, Object value) {
            Users user = (Users)value;
            map.put(user.getEmail().toString(), user);
            Logger.getGlobal().log(Level.INFO, "UserConverter - getAsString");
            return user.getEmail().toString();
        }
    }
    

    失败的代码:

    ticketUpdateController.lovResearchers - 类型列表 - 从JpaController获取的列表。 ticketUpdateController.researcher - 类型用户

    我试图添加inputHidden,因为这个页面有一个viewParam,我需要保持这个值来刷新。虽然没有它,但情况也是如此。

        <p:dialog id="assignResearcherDialog" header="Assign Researcher" widgetVar="assignResearcher" resizable="false">
            <h:form id="assignResearcherForm">
                <p:panel>
                    <p:selectOneListbox id="selRec" value="#{ticketUpdateController.researcher}">
                        <f:selectItems value="#{ticketUpdateController.lovResearchers}" var="r" itemLabel="#{r.email}" itemValue="#{r}"></f:selectItems>
                        <f:converter converterId="misc.util.UserConverter"></f:converter>
                        <h:inputHidden value="#{ticketUpdateController.ticketNumber}"></h:inputHidden>
                    </p:selectOneListbox>
                    <p:commandButton value="Assign" actionListener="#{ticketUpdateController.setResearcher}" oncomplete="handleSubmitRequest(xhr, status, args, 'assignResearcherDialog','assignResearcherForm');" update=":ticketUpdateForm :message">
                        <h:inputHidden value="#{ticketUpdateController.ticketNumber}"></h:inputHidden>
                        <f:param id="tnr" value="#{ticketUpdateController.ticketNumber}"></f:param>
                    </p:commandButton>
                </p:panel>
            </h:form>
        </p:dialog>
    

    我的问题排查:

    • 我检查了Users类,并且根本没有调用equals。 (通过在那里放置记录器来检查)
    • 将日志记录放在转换器类中以查看它何时被调用。到目前为止似乎被称为neede。当我按下某个按钮时,JSF页面加载。
    • 在TicketUpdateController bean的init中添加了logge,以便我可以看到这些值是否仍然在内存中。
    WARNING: class gui.controller.TicketUpdateController Starting... 
    WARNING: class gui.controller.TicketUpdateController Setting Values...
    INFO: UserConverter - getAsString INFO: UserConverter - getAsString
    INFO: UserConverter - getAsString INFO: UserConverter - getAsString
    WARNING: class gui.controller.TicketUpdateController Starting... 
    WARNING: class gui.controller.TicketUpdateController Setting Values...
    INFO: UserConverter - getAsString INFO: UserConverter - getAsString
    INFO: UserConverter - getAsString INFO: UserConverter - getAsString
    INFO: UserConverter - getAsObject Researcher@localhost.com 
    INFO:UserConverter - getAsObject value Researcher@localhost.com 
    WARNING: class gui.controller.TicketUpdateController Starting...
    

1 个答案:

答案 0 :(得分:0)

发现错误。

所以基本上我使用的是错误的班级 我的页面bean是TicketUpdateController,但我的转换器是用户。

所以我将selectItems中的字段从TicketUpdateController更改为UsersController。

毕竟我应该从UsersController而不是TicketUpdatecontroller获取所有用户。