Injecting ResourceBundle via @ManagedProperty doesn't seem to work inside @Named

怎甘沉沦 提交于 2019-11-28 12:47:25

You can't use @ManagedProperty in a CDI managed bean as annotated with @Named. You can only use it in a JSF managed bean as annotated with @ManagedBean.

CDI doesn't have any annotations to inject the evaluation result of an EL expression like as @ManagedProperty. The CDI approach is using a "CDI producer" with @Produces wherein you return the concrete type, which is PropertyResourceBundle in case of .properties file based resource bundles.

Just drop this class somewhere in your WAR:

@RequestScoped
public class BundleProducer {

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

}

Now you can inject it as below:

@Inject
private PropertyResourceBundle bundle;

In addition to BalusC's answer:

Since JSF 2.3 it is also possible to inject a resource bundle defined in faces-config.xml without the use of a producer method. There is a new annotation javax.faces.annotation.ManagedProperty (note it is in the ...annotation package, not the ...bean package) that works with @Inject:

// ...
import javax.faces.annotation.ManagedProperty;
// ...

@Named 
@SessionScoped 
public class UserBean implements Serializable {

  // ...

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

  // ...

}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!