Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JSF: Accessing Bean from Validator via field

Tags:

java

jsf

I have a JSF validator that checks whether a Container Number string conforms to the ISO-6346 specficiation.

It works fine, however I need to add some conditional processing in based on other values in the Bean where the Container Number comes from. This Bean can be of several different types.

Is there any way to access the Bean in the validator and perform operations on it? Ideally I'd love to keep it as a validator, however if there is no solution I'll have to implement the logic in the Bean before persisting.

I'm thinking something along the lines of:

public class ContainerNumberValidator implements javax.faces.validator.Validator {
   public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {

      Object bean = UIComponent.getMyBeanSomehowThroughAMagicMethod();
      if(bean instanceof BeanA) {
         //do this
      } else if(bean instanceof BeanB) {
         //do that
      }
}

UPDATE: In many ways this is a similar problem to the validation of multiple fields at the same time. This code by BalusC is helpful.

Much appreciated.

D.

like image 534
Damo Avatar asked Jul 24 '09 16:07

Damo


2 Answers

Using the <f:attribute> you can pass a Bean to the validator and retrieve it from the component as a value expression.

So my input is like this (must be using <f:validator> and not the validator attribute on the <h:inputText>) :

<h:inputText id="containerNum" size="20" maxlength="20" value="#{containerStockAction.containerStock.containerNumber}">
    <f:validator validatorId="containerNumberValidator" />
    <f:attribute name="containerBean" value="#{containerStockAction.containerStock}"/>
</h:inputText>

And my validator class:

public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
  String containerNumber = (String)value;
  Object containerBean = component.getValueExpression("containerBean").getValue(context.getELContext());

  if(containerBean instanceof BeanA) {
    //do this
  }
like image 149
Damo Avatar answered Oct 13 '22 20:10

Damo


You can use the following to get any old bean you like using the FacesContext. Very similar to the solution you found.

public void validate(FacesContext context, UIComponent component, Object value)
{
    Application app = context.getApplication();

    ValueExpression expression = app.getExpressionFactory().createValueExpression( context.getELContext(),
            "#{thingoBean}", Object.class );

    ThingoBean thingoBean = (ThingoBean) expression.getValue( context.getELContext() );
}
like image 41
Martlark Avatar answered Oct 13 '22 21:10

Martlark