Jsf 验证程序在服务器第一次启动时不工作,在项目重新加载后工作

Jsf 验证程序在服务器第一次启动时不工作,在项目重新加载后工作,jsf,validation,Jsf,Validation,我遇到了一个非常奇怪的问题: 在Tomcat7.0服务器上第一次启动JSF项目时,用户名的验证器不起作用。如果我重新加载这个项目,所有的事情都会突然变得很有魅力。奇怪的是,registerUser方法总是有效的 以下是我的代码片段: <h:outputLabel value="Username:" for="username"></h:outputLabel> <h:inputText id="username" value="#{r

我遇到了一个非常奇怪的问题: 在Tomcat7.0服务器上第一次启动JSF项目时,用户名的验证器不起作用。如果我重新加载这个项目,所有的事情都会突然变得很有魅力。奇怪的是,registerUser方法总是有效的

以下是我的代码片段:

        <h:outputLabel value="Username:" for="username"></h:outputLabel>
        <h:inputText id="username" value="#{register.name}" validator="# {register.validateName}" validatorMessage="Suggestion: Try another name">
        <h:message for="username"></h:message></h:inputText>
经过一些研究,我发现,由于某种未知的原因,验证程序中的字符串名为null,并且我无法填充它,即使我在这个方法中直接调用getName()。
有人对此有解决方案吗?

忽略SQL注入漏洞和许多(!!)其他设计错误,以下是有缺陷的:

public void validateName(FacesContext context, UIComponent component, Object value) throws ValidatorException, SQLException {
    queryString = "SELECT username FROM tbl_benutzer WHERE username='"+ name +"'";
    // ...
您没有使用提交的值,该值作为第三个参数
可用。您直接使用的是模型值
name
,而在调用验证器时该值尚未更新。基本上,您使用的是初始值,而不是提交的值。这也解释了为什么它只在第二次提交表单后才“起作用”

相应地进行修正:

public void validateName(FacesContext context, UIComponent component, Object value) throws ValidatorException, SQLException {
    queryString = "SELECT username FROM tbl_benutzer WHERE username='"+ value +"'";
    // ...

再一次,代码中有太多的设计错误。我真的希望你的导师知道他在做什么。

validator=“#{register.validateName}”
你的代码中的一个精确的复制粘贴?在代码中包含一个严重的SQL注入漏洞。这只是一个大学项目。主要关注的是服务器,而不是数据库,我知道这个空洞,但是我访问数据库的方式并不重要。{是复制/粘贴错误吗?我刚刚发现,调用验证程序时,主要问题似乎是名称为空。调用验证程序时,似乎出现了问题。我是否可以延迟此操作?非常感谢。在我阅读此内容后,我立即掌心。现在可以完美地工作。Stuuuuupid被我搞错了。我相信我的tutor知道自己在做什么,但他通常喜欢使用代码而不是完全干净的代码。此外,我不是最有天赋的程序员(事实上,我很惊讶自己在没有寻求帮助的情况下走到了这一步)。无论如何,再次感谢:)
public void validateName(FacesContext context, UIComponent component, Object value) throws ValidatorException, SQLException {
    queryString = "SELECT username FROM tbl_benutzer WHERE username='"+ value +"'";
    // ...