我尝试学习JSF并面临问题。
我使用了Servlet 2.5、JDK 1.6和JSF 2.0.6。
我有一个简单的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 with converter,工作正常
<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
属性上,没有另一个显式指定的转换器。