在ManagedProperty中使用ResourceBundle中的Properties

时间:2011-04-11 14:03:51

标签: jsf jsf-2 resourcebundle postconstruct

我有一个JSF验证器,我正在构建其中包含我希望从ResourceBundle加载的属性。但是,我不太确定如何使用它,因为它没有正确加载。关于如何使这项工作的任何想法?

我尝试使用@PostContruct来执行此操作,但我在Eclipse中遇到以下错误:

  

访问限制:类型   PostConstruct因无法访问   对所需图书馆的限制   /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/classes.jar

所以,我不太清楚最好的方法是什么。我正在谈论的一个样本是......

验证员......

@FacesValidator("usernameValidator")
public class UserNameValidator implements Validator {

  @ManagedProperty(value="#{props_userNamePattern}")
  private String userNamePattern;  

  @ManagedProperty(value="#{props_minUserNameLength}")
  private int minUserNameLength;  

  @ManagedProperty(value="#{props_maxUserNameLength}")
  private int maxUserNameLength;

  public void validate(FacesContext context, UIComponent component, Object
        value) throws ValidatorException {
    //My validations here...   
  }

  //Setters for the class properties

}

面-config.xml中

<resource-bundle>
    <base-name>settings</base-name>
</resource-bundle>

settings.properties

props_userNamePattern = /^[a-z0-9_-]+$/
props_minUserNameLength = 3
props_maxUserNameLength = 30

3 个答案:

答案 0 :(得分:6)

@ManagedProperty仅适用于@ManagedBean课程。 @PostConstruct也不是您功能需求的正确解决方案。它的目的是放在一个方法上,该方法在构造类时完成所有依赖注入。您遇到的错误是由旧的Eclipse + JRE版本的特定组合引起的。如果无法升级,您可以通过 Window&gt;禁用警告/错误。偏好&gt; Java&gt;编译器&gt;错误/警告&gt;弃用和受限制的API&gt;禁止参考&gt;忽略

至于你的功能需求,遗憾的是没有任何注释可以实现。但是你可以通过编程方式获得它。

String bundlename = "settings";
Locale locale = FacesContext.getCurrentInstance().getViewRoot().getLocale();
ResourceBundle bundle = ResourceBundle.getBundle(bundlename, locale);
String usernamePattern = bundle.getString("props_userNamePattern");
// ...

您可以在验证程序的构造函数中执行此操作。如果使用得当,无论如何都会为每个视图创建一个新实例。

答案 1 :(得分:0)

添加BalusC的正确答案;在JSF 2.0 / 2.1验证器中,转换器,PhaseListeners等是一种“二等”公民,因为它们不是注入目标。

这也意味着您无法注入实体管理器或EJB,有时可用于验证目的。

在JSF 2.2中,这应该改变:

  

所有JSF生命周期工件都应该是   CDI感知和支持   注入/ JSR-299 / JSR-330   (PhaseListeners,NavHandlers,   组件,ActionListeners,   一切。)

请参阅:http://jcp.org/en/jsr/detail?id=344

答案 2 :(得分:0)