【问题标题】:JSF does not convert InputText value to string variable of backing bean without custom converterJSF 不会在没有自定义转换器的情况下将 InputText 值转换为支持 bean 的字符串变量
【发布时间】:2013-03-23 21:31:53
【问题描述】:

我尝试学习 JSF 并面临问题。
我确实使用了 Servlet 2.5、JDK 1.6 和 JSF 2.0.6(来自 pom 文件的 com.sun.faces 版本)。

我有一个简单的 JSF 页面,其中有一个 <h:inputText/> 标记用于与用户交互

我希望用户填写此h:inputText,然后单击h:commandButton,然后在服务器端我将获得具有更新值的支持 bean。

但在我的情况下,JSF 的生命周期在 process validations 中断,移动到 render response 并向用户显示“解析器错误!”留言

即对于没有任何验证器和转换器的简单 h:inputText,我从服务器端收到有关解析 h:inputText 值的错误消息。

一段时间后,我想出了什么可以创建自己的转换器,它不会修改对象,只需通过自己传递String

我确实将转换器的实现添加到 <h:inputText/> 并且这项工作。

问题:
在书籍和其他教程中的所有示例中,如果 inputText 是支持 bean 的 String 值的表示,则没有人使用 <h:inputText/> 的自定义转换器。
如果没有自定义转换器,为什么所有这些教程和示例都不适合我?我的错在哪里?

源代码:
index.xhtml 没有转换器,不适合我:

<h:form id="UserForm">
    <h:outputText value="Insert your first name:" />
    <h:inputText id="userNameID" required="true" value="#{userBean.firstName}">
        <f:validateLength minimum="5" maximum="25" />
    </h:inputText>
    <h:message showSummary="true" showDetail="false" for="userNameID" />

    <h:commandButton id="submit" action="/view/validator/response?faces-redirect=true"
        value="Submit" />
</h:form>

UserBean.java

@ManagedBean(name = "userBean")
@SessionScoped
public class UserBean implements Serializable {

    private String firstName;

    public String getFirstName() {
        return this.firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

}

MyConverter.java - 虚拟转换器

@FacesConverter(value = "myConverter")
public class MyConverter implements Converter {

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
         return value;
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        return value.toString();
    }
}

index.xhtml 与转换器,按预期工作:

<h:form id="UserForm">
    <h:outputText value="Insert your first name:" />
    <h:inputText id="userNameID" required="true" value="#{userBean.firstName}" converter="myConverter">
        <f:validateLength minimum="5" maximum="25" />
    </h:inputText>
    <h:message showSummary="true" showDetail="false" for="userNameID" />

    <h:commandButton id="submit" action="/view/validator/response?faces-redirect=true"
        value="Submit" />
</h:form>

【问题讨论】:

  • 你没有运行你认为你正在运行的代码。该错误来自不同的转换器,目前在提供的信息中不可见。也许您已经创建了一个 @FacesConverter(forClass=String.class),它会自动在每个 String 属性上运行?
  • BalusC,感谢您的回答。你说的对。我在sys.out "detail=(Cannot parse this date!)" 和另一节课的DateConverter 中有消息。将DateConverter@FacesConverter 更改为@FacesConverter(value = "dateConverter") 后,所有工作都按预期进行。但是为什么这个转换器在没有任何转换器的情况下应用于inputText
  • 因为forClass.

标签: jsf jsf-2 converter


【解决方案1】:

到目前为止,问题的原因在发布的代码中不可见,但关键症状 “它失败并显示来自迄今为止未识别的转换器的消息,而它成功使用显式转换器”建议您在同一个项目的其他地方有一个@FacesConverter(forClass=String.class),它将在每个没有明确指定另一个转换器的String 属性上自动运行。

【讨论】:

  • 我没有任何forClass 转换器,但您的建议对我有帮助
  • 如果你没有像@FacesConverter public class FooConverter {}那样指定任何明确的转换器名称或类,那么它默认为String类,因此应用于每个没有String的输入显式转换器。
猜你喜欢
  • 2012-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-22
  • 2022-07-07
相关资源
最近更新 更多