Как использовать валидатор шва в JSF? - PullRequest
1 голос
/ 27 января 2011

Я сделал новый валидатор Seam:

    package validators;

import java.io.Serializable;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.faces.validator.ValidatorException;

import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.faces.Validator;
import org.jboss.seam.annotations.intercept.BypassInterceptors;
import org.jboss.seam.log.Log;
import org.jboss.seam.log.Logging;

@Name("roCountyValidator")
@Validator
@BypassInterceptors
public class RoCountyValidator implements javax.faces.validator.Validator,
        Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = -3876319398131645955L;
    Log log = Logging.getLog(RoCountyValidator.class);

    public void validate(FacesContext context, UIComponent component,
            Object value) throws ValidatorException {
        log.info("validating....!");
        if (String.valueOf(value).equals("Arad"))
            ((UIInput) component).setValid(true);
        else {
            ((UIInput) component).setValid(false);
            FacesMessage message = new FacesMessage();
            message.setDetail("Invalid county");
            message.setSeverity(FacesMessage.SEVERITY_ERROR);
            throw new ValidatorException(message);
        }
    }
}

Проблема в том, что я не знаю, как использовать его непосредственно из jsf ...

Следующее не работает....

Я объявил это в специальном файле taglib: myvalidators.taglib.xml

<facelet-taglib>
<namespace>http://example.com/jsf/my/validators</namespace>
<tag>
    <tag-name>roCountyValidator</tag-name>
    <validator>
        <validator-id>roCountyValidator</validator-id>
    </validator>
</tag>

и попытался использовать его следующим образом:

<h:inputText id="someField" value="#{booking.creditCardName}" 
                               required="true" label="County">
                <my:roCountyValidator/>
                <h:message for="someField"/>
            </h:inputText>

Можете ли вы сказать мне, где я не прав?

Спасибо.

Ответы [ 3 ]

3 голосов
/ 28 января 2011

Два способа решить эту проблему.

Один из них - использовать, как написал @BalusC.Вам не нужно ничего определять в Face-config.xml

<h:inputText id="cc" required="true" value="#{booking.creditCardName}">
                <f:validator validatorId="roCountyValidator"/>
                <f:attribute name="oldCreditCardNumber" value="#{booking.creditCardName}" />
                <s:validate />
</h:inputText>

Здесь вы даже можете привязать старый номер кредитной карты, если вы хотите проверить это также.

Затем вВаш метод проверки:

public void validate(FacesContext context, UIComponent component,
        Object value) throws ValidatorException {
    log.info("validating....!");

    String oldCreditcard = String.valueOf(component.getAttributes().get("oldCreditCardNumber"));
    String newCreditCard = (String) value;
    if(SomeClass.isCorrectCreditcard(newCreditCard)) {
        //You don't need to setValid(false), this is done automatically
        Map<String, String> messages = Messages.instance();
            throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, messages.get("wrongCreditCardNumber"), messages
                    .get("wrongCreditCardNumber")));

    }
}


Другой способ - использовать тег validator в <h:inputText>

. Вам даже не нужно создавать класс @Validator, если онкомпонент шва и если вы используете одну и ту же сигнатуру метода.

Я использую компонент валидатора для всех моих общих валидаторов

@Name("validator")
@Scope(ScopeType.EVENT)
@BypassInterceptors
public class Validator {

public void positiveInteger(FacesContext context, UIComponent toValidate, Object value) {
        String val = (String) value;

        try {
            int v = Integer.parseInt(val);
            if (v < 0)
                throw new NumberFormatException();
        } catch (NumberFormatException e) {
            ((UIInput) toValidate).setValid(false);
            FacesMessages.instance().addToControlFromResourceBundle(toValidate.getId(), "invalid.integer");
        }
    }
}

Теперь вы можете добавить валидатор:

<h:inputText value="#{foo.bar}" required="true" validator="#{validator.positiveInteger}">
  <s:validate/>
<h:inputText>
0 голосов
/ 27 января 2011

Решение найдено:).

Забудьте о ярлыках и прочем!

Используйте это как:

<h:inputText id="someField" value="#{booking.creditCardName}" 
                               required="true" label="County" validator="roCountyValidator">
                <h:message for="someField"/>
            </h:inputText>

Пожалуйста, отметьте, что

validator="roCountyValidator"

это не должно использоваться как выражение EL !!! (мое первое неправильное решение)

Так что преимущество использования Seam + @Validator: Seam преобразует этот компонент в фоновом режиме в валидатор jsf, поэтому вам больше не нужны теги валидатора jsf или любая другая конфигурация вface-config.xml.

0 голосов
/ 27 января 2011

Я понятия не имею о части шва, у нее могут быть разные подходы, но в стандартном JSF вы обычно определяете его как <validator> в faces-config.xml.

<validator>
    <validator-id>roCountyValidator</validator-id>
    <validator-class>validators.RoCountyValidator</validator-class>
</validator>

и используйте его следующим образом:

<h:inputText>
    <f:validator validatorId="roCountyValidator" />
</h:inputText>
...