Использование свойств из ResourceBundle в ManagedProperty - PullRequest
4 голосов
/ 11 апреля 2011

У меня есть созданный JSF Validator со свойствами, которые я хотел бы загрузить из 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 ]

6 голосов
/ 11 апреля 2011

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

Вы можете сделать это в конструкторе валидатора. При правильном использовании новый экземпляр будет создан для каждого представления в любом случае.

0 голосов
/ 12 апреля 2011
0 голосов
/ 11 апреля 2011

Добавление к правильному ответу BalusC;В JSF 2.0 / 2.1 валидаторы, конвертеры, PhaseListener и т. Д. Являются своего рода «второсортными» гражданами, поскольку они не являются объектами инъекций.

Это также означает, что вы не можете внедрить менеджер сущностей или EJB,который иногда может использоваться для проверки.

В JSF 2.2 это должно измениться:

Все артефакты жизненного цикла JSF должны учитывать CDI и поддерживать инъекцию / JSR-299 /JSR-330 (PhaseListeners, NavHandlers, Компоненты, ActionListeners, все.)

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

...