在自定义验证器中注入

时间:2013-01-21 11:14:40

标签: jsf-2 validation

  

可能重复:
  Dependency injection in FacesValidator (JSF Validation)

也许,我遗漏了一些基本的东西 - 但是我不能在自定义验证器类中使用注入来使用消息资源?下面的代码在msg上给我一个null,所以注入显然不起作用,但为什么呢?如果不可能,我该如何访问消息资源?到目前为止我找到的所有示例都在验证器消息中使用硬编码文本,这对于本地化不是很有用。

public class BirthdateValidator implements Validator {
    @Inject
    private transient ResourceBundle msg;

    @Override
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
            if ( [some validation fails] ) {
                FacesMessage message = new FacesMessage(msg.getString("validator.birthday"));
                message.setSeverity(FacesMessage.SEVERITY_ERROR);
            }
    }
}

1 个答案:

答案 0 :(得分:10)

至于为什么它不起作用,请参阅以下答案:How to inject in @FacesValidator with @EJB, @PersistenceContext, @Inject, @Autowired。简而言之,注释它@Named而不是@FacesValidator,并在<h:inputXxx validator><f:validator binding>中将其引用为#{birthdateValidator}。问题是由JSF / CDI人员监督造成的。这在即将到来的JSF 2.2中得到修复。


  

好的,因为我只需要访问消息包,如何在不注入的情况下访问它?

使用Application#evaluateExpressionGet()以编程方式评估它:

ResourceBundle msg = context.getApplication().evaluateExpressionGet(context, "#{msg}", ResourceBundle.class);
// ...

您甚至可以选择一个特定的密钥:

String msg = context.getApplication().evaluateExpressionGet(context, "#{msg.key}", String.class);
// ...

另见:

相关问题