Jsf 如何验证自定义转换器?

Jsf 如何验证自定义转换器?,jsf,jsf-2,Jsf,Jsf 2,我有一个自定义转换器,它是: @ManagedBean @RequestScoped public class MeasureConverter implements Converter { @EJB private EaoMeasure eaoMeasure; @Override public String getAsString(FacesContext context, UIComponent component, Object value) {

我有一个自定义转换器,它是:

@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" />
因此,当模糊事件发生时,它调用我的
validate
bean,该bean具有BalusC所说的requestScope,但它是一个空字符串

有什么想法吗?

你应该实施一个新的计划

例如

您可以通过输入组件的
validator
属性声明它

<h:inputText validator="measureValidator">

或者通过标记(是的,您可以有多个;它们将按照连接到组件的顺序被调用)


转换器与此无关。它已经完成了将
字符串
转换为
度量值
的工作。验证器将只检索
度量值
。您在那里使用的
@ManagedProperty
也不会以这种方式工作。它基本上会用
request.getParameter(“measure”)
的结果设置属性,我认为表单中没有提交这样的参数

@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"));
        }
    }

}
<h:inputText validator="measureValidator">
<h:inputText>
    <f:validator validatorId="measureValidator" />
</h:inputText>