我想从faces-config.xml初始化bean(应用程序范围)的属性。我尝试了不同的配置,但没有成功。在库级别,我使用的是jsf2.2-joss-jsf-api_2.2_spec.jar。在项目级别,faces-config配置为2.0版本。我不知道这是不是问题所在。JBDS 7不允许我更改为2.2,因为与其他Project Facets有冲突。
这是faces-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<faces-config version="2.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd">
<managed-bean>
<managed-bean-name>appBean</managed-bean-name>
<managed-bean-class>package.ApplicationBean</managed-bean-class>
<managed-bean-scope>application</managed-bean-scope>
<managed-property>
<property-name>cookieNameLocale</property-name>
<property-class>java.lang.String</property-class>
<value>someText</value>
</managed-property>
<managed-property>
<property-name>debug</property-name>
<property-class>boolean</property-class>
<value>true</value>
</managed-property>
</managed-bean>
<application>
<locale-config>
<default-locale>xx_XX</default-locale>
<supported-locale>xx_XX</supported-locale>
</locale-config>
<resource-bundle>
<base-name>locale</base-name>
<var>i18n</var>
</resource-bundle>
</application>
</faces-config>
这是应用程序范围bean:
public class ApplicationBean implements Serializable {
private boolean debug;
private String cookieNameLocale;
//respectively getters and setters
}
当@将appBean注入另一个会话作用域bean时,属性不会初始化。没有错误,appBean是在会话bean之前创建的(使用@PostConstruct打印)
faces-config.xml
中的<managed-bean>
条目基本上声明了一个新的@ManagedBean
。即JSF管理的bean。然而,使用@Inject
,您基本上是在注入一个CDI管理的bean。
这是两种相互排斥的管理bean的方法。实际上,您最终得到了两个相同bean类的实例,一个由JSF通过faces-config.xml
管理,另一个由CDI通过注释管理。只有JSF管理的一个才设置了这些属性。
您有两个选项:
-
使用
@ManagedProperty
将其作为JSF管理的bean注入。然而,这反过来要求接收器本身也是JSF管理的bean。 -
完全忘记
faces-config.xml
方法。在web.xml
或服务器配置中将它们定义为JNDI资源,并使用@Resource
注入它们。或者,将它们定义为.properties
文件设置或web.xml
中的<context-param>
条目。CDI没有提供开箱即用的方法来注入它们,但可以为此创建一个带有CDIProducer
的自定义注释。