我有一个自定义转换器:
@ManagedBean
@RequestScoped
public class MeasureConverter implements Converter {
@EJB
private EaoMeasure eaoMeasure;
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
if (!(value instanceof Measure) || ((Measure) value).getId() == null) {
return null;
}
return String.valueOf(((Measure) value).getId());
}
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
if (value == null || !value.matches("\\d+")) {
return null;
}
Measure measure = eaoMeasure.find(Integer.valueOf(value));
if (measure == null) {
throw new ConverterException(new FacesMessage("Unknown Measure ID: " + value));
}
return measure;
}
但我想验证这一点,因为我正在使用其他字段,就像这样:
<h:outputLabel for="name" value="Name:" />
<h:inputText id="name" value="#{bean.name}">
<f:ajax event="blur" listener="#{validator.name}" render="m_name" />
</h:inputText>
<rich:message id="m_name" for="name" ajaxRendered="false" />
因此,当blur
事件发生时,会出现一个图标,指示选择是否正确(上面的代码执行此操作我正在说话)
但是我想在这个相同的自定义转换器中应用这种验证,只是为了通过我的项目保持标准验证到各种输入或类型。
我已尝试在@ManagaProperty
中使用RequestScope
但未成功:
@ManagedProperty("#{param.measure}")
private String measure;
因此,当模糊事件发生时,它会调用我的validate
bean,它具有请求范围,因为BalusC说here,但它来的是一个空字符串。
有什么想法吗?
答案 0 :(得分:1)
您应该实施Validator
。
E.g。
@FacesValidator("measureValidator")
public class MeasureValidator implements Validator {
@Override
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
Measure measure = (Measure) value;
// ...
if (!valid) {
throw new ValidatorException(new FacesMessage("Not valid"));
}
}
}
您可以通过输入组件的validator
属性
<h:inputText validator="measureValidator">
或<f:validator>
标记(是的,您可以拥有多个标记;它们将按照它们附加到组件的顺序调用)
<h:inputText>
<f:validator validatorId="measureValidator" />
</h:inputText>
此处转换器不相关。它已经完成了将String
转换为Measure
的工作。验证器将只检索Measure
。您在那里的@ManagedProperty
也不会那样工作。它基本上会使用request.getParameter("measure")
的结果设置属性,我不认为你的表单提交了这样的参数。