如果没有自定义转换器,JSF不会将InputText值转换为支持bean的字符串变量

时间:2013-04-02 14:23:52

标签: jsf jsf-2 converter

我尝试学习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并向用户显示“Parser错误!”留言

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

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

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

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

源代码:
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>

1 个答案:

答案 0 :(得分:2)

到目前为止发布的代码中看不到问题的原因,但关键症状“它失败了,当一个显式转换器成功时,来自目前尚未识别的转换器的消息”表明你在同一个项目中的其他地方@FacesConverter(forClass=String.class)会自动运行在每个String属性上,而这个属性没有明确指定另一个转换器。