动作侦听器在调用应用程序阶段运行。此时,输入组件提交的可用值UIInput#getSubmittedValue()仅在输入组件本身转换或验证失败时才可用。在验证阶段,如果输入组件已经成功转换和验证,则提交的值将被清除并设置组件的(本地)值。这是可用的UIInput#getValue()。
所以,你实际上应该使用:
String userName = (String) input.getValue();
与具体问题无关,动作侦听器是执行验证的错误工具(至少,动作侦听器的类名暗示您的具体功能要求是验证用户名)。您应该为此使用普通的验证器。摆脱整体actionListener并注册一个<h:inputText validator>或<f:validator>代替通常的方式。通过这种方式,提交的(和转换的,如果适用的话)值可以立即作为接口中validate()方法的第三个参数使用。Validator
例如
<h:inputText ... validator="usernameValidator">
<a4j:support event="onblur" />
</h:inputText>
有类似的东西
public class UsernameValidator implements Validator {
@Override
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
String username = (String) value;
// ...
if (!valid) {
throw new ValidatorException(new FacesMessage("Invalid username."));
}
}
}