4

ResourceBundleからロードしたいプロパティを持つJSFバリデーターを構築しています。ただし、正しく読み込まれていないため、これをどのように処理するかはよくわかりません。これを機能させる方法について何かアイデアはありますか?

を使用して実行しようとしました@PostContructが、Eclipseで次のエラーが発生します。

アクセス制限:必要なライブラリ/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/classes.jarの制限により、タイプPostConstructにアクセスできません。

だから、私はこれを行うための最良の方法が何であるかよくわかりません。私が話していることのサンプルは以下にあります...

バリデーター...

@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

}

faces-config.xml

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

settings.properties

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

3 に答える 3

6

クラスでのみ@ManagedProperty動作します。@ManagedBeanまた@PostConstruct、機能要件に対する正しいソリューションではありません。これは、クラスが構築され、すべての依存性注入が終了したときに実行されるメソッドに配置されることを目的としています。直面しているエラーは、古いEclipse+JREバージョンの特定の組み合わせが原因で発生します。アップグレードがオプションでない場合は、ウィンドウ>設定>Java>コンパイラ>エラー/警告>非推奨および制限されたAPI>禁止された参照>無視によって警告/エラーを無効にすることができます。

機能要件に関しては、残念ながら、それを実現する注釈は思い浮かびません。ただし、プログラムで取得することはできます。

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

BalusCの正解に追加します。JSF 2.0 / 2.1では、バリデーター、コンバーター、フェーズリスナーなどはインジェクションターゲットではないため、一種の「二流」市民です。

これは、エンティティマネージャまたは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 に答える
0

おそらく、継ぎ目面がこの状況に役立つ可能性がありますか?

于 2011-04-12T07:32:28.880 に答える