Reputation: 31669
I have a problem related to JSF 2. I'm using the 2.1.4 version with a Tomcat 6 server. I'm migrating an application that was originally written for jsf 1.2. According that, every JSF managed bean for the application is declared in the faces-managed-beans.xml file. The problem comes when I try to set a property using new JSF 2 @ManagedProperty annotation. For example this code works for me.
<managed-bean>
<managed-bean-name>navegableSessionParamsManager</managed-bean-name>
<managed-bean-class>com.tesicnor.system.view.beans.navegable.NavegableSessionParamsManager</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>_LoggedBean</property-name>
<value>#{loggedBean}</value>
</managed-property>
<managed-property>
<property-name>_LocaleBean</property-name>
<value>#{localeBean}</value>
</managed-property>
</managed-bean>
The session scoped navegableSessionParamsManager bean is receiving both loggedBean and localeBean values, which also are session scoped beans. However, if I use annotations I declare the three @ManagedBean and @SessionScoped, and I use @ManagedProperty("#{loggedBean}") and @ManagedProperty("#{localeBean}"), but properties are not being set.
LoggedBean class.
@ManagedBean
@SessionScoped
public class LoggedBean extends BaseBean implements Observer {
/**
*
*/
private static final long serialVersionUID = 1L;
...
NavegableSessionParamsManager class
@SuppressWarnings("serial")
@ManagedBean
@SessionScoped
public class NavegableSessionParamsManager extends SystemNavegable {
@ManagedProperty("#{loggedBean}")
private LoggedBean _LoggedBean;
public void set_LoggedBean(LoggedBean _LoggedBean) {
this._LoggedBean = _LoggedBean;
}
...
That's my web.xml file
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.5"
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-app_2_5.xsd">
<display-name>System_V4</display-name>
<context-param>
<param-name>javax.faces.CONFIG_FILES</param-name>
<param-value>/WEB-INF/faces-config.xml, /WEB-INF/faces-managed-beans.xml, /WEB-INF/faces-navigation.xml</param-value>
</context-param>
<context-param>
<description>Do not render comments in facelets (xhtml) pages. Default is false.</description>
<param-name>javax.faces.FACELETS_SKIP_COMMENTS</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<description>
Define the value returned by Application.getProjectStage(). Allowed values: Production, Development,
UnitTest, SystemTest, Extension. Default value is Production.
</description>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
<context-param>
<param-name>primefaces.THEME</param-name>
<param-value>pepper-grinder</param-value>
</context-param>
<!-- filter enforcing charset UTF-8 - must be first filter in the chain! -->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- Advanced Security Filter -->
<!-- FILTRO PROPIO. -->
<filter>
<filter-name>SystemFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>SystemFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>SystemUrlFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>SystemUrlFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- Filter to set character encoding on each request "Set Character Encoding"
for "X-UA-Compatible" de microsoft -->
<filter>
<filter-name>SetHttpHeadersFilter</filter-name>
<filter-class>com.tesicnor.system.view.filters.SetHttpHeadersFilter</filter-class>
<init-param>
<param-name>X-UA-Compatible</param-name>
<param-value>IE=EmulateIE7</param-value>
</init-param>
</filter>
<!-- Primefaces -->
<filter>
<filter-name>PrimeFaces FileUpload Filter</filter-name>
<filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SetHttpHeadersFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>PrimeFaces FileUpload Filter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
<listener>
<listener-class>com.sun.faces.config.ConfigureListener</listener-class>
</listener>
<listener>
<listener-class>org.quartz.ee.servlet.QuartzInitializerListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>com.tesicnor.system.view.session.WebSessionListener</listener-class>
</listener>
<listener>
<listener-class>com.tesicnor.system.view.session.WebRequestListener</listener-class>
</listener>
<!-- FIN JavaServer Faces Faces Servlet -->
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- SERVLET DE CXF (Web Services) -->
<servlet>
<servlet-name>CXFServlet</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
</servlet>
<!-- FIN Faces Servlet Faces Servlet Mapping -->
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/ws/*</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>60</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<error-page>
<error-code>404</error-code>
<location>/404.xhtml</location>
</error-page>
I don't know what kind of advantages using annotations in JSF 2 has, but everybody is doing that. Also, can I be in trouble if I use annotations and also xml bean mappings for the same bean?
Upvotes: 1
Views: 2602
Reputation: 31669
Finally after a while I have solved it adding *.faces and *.xhmtml servlet-mappings in my web.xml, which where not required before.
With that:
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.faces</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
Now annotations are working.
Upvotes: 0
Reputation: 2967
This answer is based on the assumption that you still have bean defined in faces-config.xml.
You have mentioned you migrated to JSF2. So,did you still haveNavegableSessionParamsManager
bean defined in faces-config.xml like in your OP. If you define NavegableSessionParamsManager
in your faces-config.xml
and same you annotate with @ManagedProperty
the server will instantiate whatever defined in faces-config.xml first.
Cause xml
files will take the precedence at the time of servlet container start up, in this scenario and what ever in the java code will be simply ignored.
If you comment out the code in faces-config.xml
whatever the annotations you have used will work fine.May be you have to do like this.
<--- <managed-bean>
<managed-bean-name>navegableSessionParamsManager</managed-bean-name>
<managed-bean-class>com.tesicnor.system.view.beans.navegable.NavegableSessionParamsManager</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>_LoggedBean</property-name>
<value>#{loggedBean}</value>
</managed-property>
<managed-property>
<property-name>_LocaleBean</property-name>
<value>#{localeBean}</value>
</managed-property>
</managed-bean>---->
and now try with annotations.
Upvotes: 0