可能重复:
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);
}
}
}
答案 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);
// ...