Как проверить пользовательский конвертер? - PullRequest
0 голосов
/ 06 ноября 2011

У меня есть специальный конвертер:

@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-компонент, который имеет requestScope, как сказал BalusC здесь , но это пустая строка.

Есть идеи?

1 Ответ

1 голос
/ 06 ноября 2011

Вы должны реализовать Validator.

* 1006 Е.Г. *

@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"), и я не думаю, что в вашей форме есть такой параметр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...