6

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

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

1 回答 1

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);
// ...

你甚至可以选择一个特定的键:

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

也可以看看:

于 2013-01-21T12:26:50.050 回答