2015-01-20 4 views
3

Как я могу получить доступ к набору сообщений из java-кода для получения сообщения в соответствии с текущей локалью?Injecting ResourceBundle через @ManagedProperty не работает внутри @Named

Я попытался с помощью @ManagedProperty, как показано ниже:

@Named 
@SessionScoped 
public class UserBean implements Serializable { 

    @ManagedProperty("#{msg}") 
    private ResourceBundle bundle; 

    // ... 

    public void setBundle(ResourceBundle bundle) { 
     this.bundle = bundle; 
    } 

} 

Тем не менее, остается null. Кажется, что он не работает внутри @Named.

Это, как я зарегистрировал пакет ресурсов в faces-context.xml:

<application> 

    <message-bundle>validator.messages</message-bundle> 

    <locale-config> 
     <supported-locale>en_US</supported-locale> 
     <supported-locale>ua_UA</supported-locale> 
    </locale-config> 

    <resource-bundle> 
     <base-name>lang.messages</base-name> 
     <var>msg</var> 
    </resource-bundle> 

</application> 

udated автора:

@BalusC Я получаю ошибку

16:29:10,968 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/WEBSearchPrime_JB_lang].[Faces Servlet]] (http-localhost-127.0.0.1-8080-1) Servlet.service() for servlet Faces Servlet threw exception: org.jboss.weld.exceptions.IllegalProductException: WELD-000054 Producers cannot produce non-serializable instances for injection into non-transient fields of passivating beans\\n\\nProducer\: Producer Method [PropertyResourceBundle] with qualifiers [@Any @Default] declared as [[method] @Produces public util.BundleProducer.getBundle()]\\nInjection Point\: [field] @Inject private model.UserBean.bundle

примечание, что я также поставил Ser ializable interface

+0

@Jens Я попробовал решение, предоставляемое по вашей ссылке, но ManagedProperty не работает внутри Названный bean ... Я получаю ошибку, где bundle.getString ("_ login_error") –

+0

NullPointerException –

+0

@Jens 'context.addMessage (null, new FacesMessage (FacesMessage.SEVERITY_ERROR, bundle.getString (" _ login_error "), null));' –

ответ

8

Вы не можете использовать @ManagedProperty в управляемом bean-компоненте CDI в качестве аннотации с @Named. Его можно использовать только в управляемом компоненте JSF, аннотированном @ManagedBean.

У CDI нет никаких комментариев, чтобы ввести результат оценки выражения EL, например @ManagedProperty. Подход CDI использует «производитель CDI» с @Produces, в котором вы возвращаете конкретный тип, который равен PropertyResourceBundle в случаефайловых пакетов ресурсов.

Просто поместите этот класс где-нибудь в WAR:

@RequestScoped 
public class BundleProducer { 

    @Produces 
    public PropertyResourceBundle getBundle() { 
     FacesContext context = FacesContext.getCurrentInstance(); 
     return context.getApplication().evaluateExpressionGet(context, "#{msg}", PropertyResourceBundle.class); 
    } 

} 

Теперь вы можете вводить его, как показано ниже:

@Inject 
private PropertyResourceBundle bundle; 
+1

Сделайте bean req uest или application scoped. Пакеты ресурсов не должны храниться в сеансе. В противном случае вам придется вручную EL-оценить его или создать вокруг него обертку. – BalusC

+0

Я не могу сделать это ApplicationScoped, потому что это «UserBean», поэтому он должен быть уникальным и в то же время что-то не так с запросом, связанным с другой логикой ... Итак, что вы подразумеваете под «вручную EL-оценкой»? Образец или ссылка? –

+0

Просто введите запрос/приложение в область действия, в свою очередь, в области, связанной с сеансом. Что касается «вручную EL-оценить его», код просто прямо в вашем лице в методе getBundle(). – BalusC

Смежные вопросы