如果您使用的是 Java EE 8 和/或 JSF 2.3,您现在可以注入 JSF 验证器。
在 Payara Server 5.192 #badassfish 上使用 Mojarra 2.3.9.payara-p2 进行了测试。
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html">
<h:body>
Hello from Facelets
<h:form>
<h:messages/>
<h:inputText value="#{someBean.txtField}" validator="someValidator"/>
</h:form>
</h:body>
</html>
import javax.inject.Named;
import javax.enterprise.context.Dependent;
@Named(value = "someBean")
@Dependent
public class SomeBean {
private String txtField;
public String getTxtField() {
return txtField;
}
public void setTxtField(String txtField) {
this.txtField = txtField;
}
}
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.FacesValidator;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;
import javax.inject.Inject;
@FacesValidator(value = "someValidator", managed = true)
public class CustomValidator implements Validator<String> {
@Inject
NewClass newClass;
@Override
public void validate(FacesContext context, UIComponent component, String value)
throws ValidatorException {
System.out.println("validator running");
System.out.println("injected bean: " + newClass);
if (value != null && value.equals("badvalue")) {
throw new ValidatorException(new FacesMessage(newClass.getMessage()));
}
}
}
public class NewClass {
public String getMessage() {
return "secret message";
}
}
import javax.faces.annotation.FacesConfig;
// WITHOUT THIS INJECTION WILL NOT WORK!
@FacesConfig(version = FacesConfig.Version.JSF_2_3)
public class ConfigurationBean {
}
应该呈现如下内容:
在意识到需要ConfigurationBean
. 从文档中:
FacesConfig.Version.JSF_2_3
此值指示 CDI 应用于 EL 解析以及启用 JSF CDI 注入,如第 5.6.3 节“用于 EL 解析的 CDI”和第 5.9 节“CDI 集成”中所述
从这个 GitHub 问题,https ://github.com/eclipse-ee4j/glassfish/issues/22094 :
默认情况下,JSF 2.3 以与 JSF 先前版本兼容的模式运行,除非应用程序中包含 CDI 托管 bean,并带有注释 @javax.faces.annotation.FacesConfig。要切换到 JSF 2.3 模式,您将需要如下配置 bean:(显示 ConfigurationBean)
...
JSF 需要切换到“当前版本”这一事实引起了极大的争议。几乎整个 EG 都投了反对票,但最终我们无法绕过 JCP 为 Java EE 设置的向后兼容性要求以及规范负责人强制执行的要求。