在自定义验证器中注入

Ale*_*ühl 6 validation jsf-2

可能重复:
FacesValidator中的依赖注入(JSF验证)

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

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);
            }
    }
}
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 10

至于它为何不能以这种方式工作,请参阅以下答案:如何使用@EJB,@ PersistenceContext,@ Inject,@ Autowired注入@FacesValidator.简而言之,注释它@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);
// ...
Run Code Online (Sandbox Code Playgroud)

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

String msg = context.getApplication().evaluateExpressionGet(context, "#{msg.key}", String.class);
// ...
Run Code Online (Sandbox Code Playgroud)

也可以看看: