4

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

我尝试使用 a@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>

设置.属性

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

3 回答 3

6

@ManagedProperty仅在@ManagedBean课堂上工作。这@PostConstruct也不是您功能需求的正确解决方案。它旨在放置在一个方法上,该方法将在构建类并且完成所有依赖注入时执行。您面临的错误是由旧 Eclipse+JRE 版本的特定组合引起的。如果升级不是一个选项,您可以通过Window > Preferences > Java > Compiler > Errors/Warnings > Deprecated and restricted API > Forbidden reference > Ignore禁用警告/错误。

至于您的功能要求,不幸的是没有任何注释可以实现这一点。但是,您可以通过编程方式获得它。

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

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

于 2011-04-11T15:15:06.397 回答
0

也许接缝面可能有助于这种情况?

于 2011-04-12T07:32:28.880 回答
0

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

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

在 JSF 2.2 中,这应该改变:

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

见: http: //jcp.org/en/jsr/detail ?id=344

于 2011-04-11T18:09:05.040 回答