【问题标题】:Injection in custom validator [duplicate]注入自定义验证器[重复]
【发布时间】:2013-01-04 10:26:49
【问题描述】:

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

也许,我缺少一些基本的东西——但我不能在自定义验证器类中使用注入来使用消息资源吗?下面的代码在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);
            }
    }
}

【问题讨论】:

  • 我在发帖前的搜索结果中看到了这个帖子,但是主标签“spring”让我跳过了。 - 好的,因为我只需要访问消息包,我如何在不注入的情况下访问它?这样我就可以避免更改所有验证器的所有出现。

标签: jsf-2 validation


【解决方案1】:

至于为什么它不能这样工作,请参阅这个答案: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);
// ...

另见:

【讨论】:

  • 感谢您的新见解,工作正常。
猜你喜欢
  • 1970-01-01
  • 2017-07-27
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 2013-07-14
  • 1970-01-01
  • 2020-09-20
相关资源
最近更新 更多