JSF从FacesContext获取JSR-303 ValidatorFactory

时间:2014-09-17 00:43:44

标签: jsf bean-validation

有没有办法从当前面上下文中获取ValidatorFactory?

用例:

  • 不是由JSF触发的类级别验证
  • 在操作方法中创建和验证的未绑定到UIComponent
  • 的对象

2 个答案:

答案 0 :(得分:0)

bean验证器通常由jsr-299的一些实现加载[CDI - (开放式网络bean等)...]如果它在CDI中可用,你通常可以使用面部EL-Resolver来拉它。

对于用例1和2:

因为它可以在CDI中使用,所以你可以简单地注入它。

public class MyService{
    @Inject
    private ValidatorFactory validatorFactory;
}

我可能会更进一步,使这个MyService成为单身人士,并在整个服务和网络层中使用它。

答案 1 :(得分:0)

可以使用以下方法检查BeanValidator ValidatorFactory的来源:

/**
 * Retrieves the ValidatorFactory from the given context
 * 
 * @param context FacesContext
 * 
 * @return {@link ValidatorFactory}
 */
public static ValidatorFactory getValidatorFactory(final FacesContext context)
{
    final Object cachedObject = context.getExternalContext().getApplicationMap()
        .get(BeanValidator.VALIDATOR_FACTORY_KEY);

    ValidatorFactory validatorFactory;

    if (cachedObject instanceof ValidatorFactory)
        validatorFactory = (ValidatorFactory) cachedObject;
    else
        try
        {
            validatorFactory = Validation.buildDefaultValidatorFactory();
            context.getExternalContext().getApplicationMap()
                .put(BeanValidator.VALIDATOR_FACTORY_KEY, validatorFactory);
        }
        catch (final ValidationException e)
        {
            throw new FacesException("Could not build a default Bean Validator factory", e);
        }

    return validatorFactory;
}