如何验证自定义转换器?

时间:2011-11-06 03:09:25

标签: jsf jsf-2

我有一个自定义转换器:

@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,但它来的是一个空字符串。

有什么想法吗?

1 个答案:

答案 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")的结果设置属性,我不认为你的表单提交了这样的参数。