JSF + Tomahawk - Método get no backing bean

8 respostas
dansouza

Olá,

Usando o componente Tomahawk(1.1.6 e 1.1.7) Schedule da Apache percebi uma coisa estranha.
Para usar o modelo do schedule é preciso implementar get/set de um Model (que contém as entradas na agenda).
Quando o bean é chamado porém, esse método getModel() é chamado muitas vezes, tipo, mais de 100.

Alguém já viu algo parecido?
Será que há algo configurado errado em minha aplicação?

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>JSFCalendar</display-name>
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext.xml</param-value>
  </context-param>
  <listener>
    <display-name>Spring Context Listener</display-name>
    <listener-class>
			org.springframework.web.context.ContextLoaderListener
		</listener-class>
  </listener>
  <listener>
    <display-name>Spring Request Listener</display-name>
    <listener-class>
			org.springframework.web.context.request.RequestContextListener
		</listener-class>
  </listener>
  
  <servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.jsf</url-pattern>
  </servlet-mapping>
  <filter>
    <filter-name>MyFacesExtensionsFilter</filter-name>
    <filter-class>
			org.apache.myfaces.webapp.filter.ExtensionsFilter
		</filter-class>
    <init-param>
      <description>
				Set the size limit for uploaded files. Format: 10 - 10
				bytes 10k - 10 KB 10m - 10 MB 1g - 1 GB
			</description>
      <param-name>uploadMaxFileSize</param-name>
      <param-value>20m</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>MyFacesExtensionsFilter</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
  </filter-mapping>
  <filter-mapping>
    <filter-name>MyFacesExtensionsFilter</filter-name>
    <url-pattern>/faces/myFacesExtensionResource/*</url-pattern>
  </filter-mapping>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app>

Ambiente: Spring 2.5 + MyFaces Core 1.2 + Tomahawk 1.1.6 + Tomcat 6.0.18

[]'s

8 Respostas

rponte

Olá dansouza,

Não há nada de errado na sua aplicação. O JSF poderá chamar os métodos getters do seu managed bean inúmeras vezes durante o seu ciclo de vida, não existe uma quantidade de chamadas ao certo, isso depende de vários fatores, entre eles o próprio componente que possui o binding. Logo não é uma boa prática efetuar processamento ou carga de dados nos métodos getters, isso é uma recomendação de muitas autores em blogs, livros e tutoriais.

Sendo boa prática ou não, eu -muitos outros desenvolvedores- nos utilizamos da carga de dados nos métodos getters do managed bean, por questões de praticidade e comodidade, porém tomamos algumas precauções como garantir que o processamento (ou carga) de dados ocorra somente uma única vez, algo como:

public List&lt;Produto&gt; getProdutos() { if (this.produtos == null) { this.produtos = RepositorioDeProdutos.getTodosOsProdutos(); } return this.produtos; }

Abraços.

dansouza

Olá Rafael,
Pelas minhas pesquisas percebi exatamente o que você mencionou.
Enfim, a solução que você colocou é realmente a que mais vi em exemplos.

Obrigado,

L

rponte:
Sendo boa prática ou não, eu -muitos outros desenvolvedores- nos utilizamos da carga de dados nos métodos getters do managed bean, por questões de praticidade e comodidade, porém tomamos algumas precauções como garantir que o processamento (ou carga) de dados ocorra somente uma única vez, algo como:

public List&lt;Produto&gt; getProdutos() { if (this.produtos == null) { this.produtos = RepositorioDeProdutos.getTodosOsProdutos(); } return this.produtos; }

Apesar dessa técnica ser utilizada com frequência, deve ser evitada no contexto do Faces. O problema está no ciclo de vida, pois espera-se que ações sejam realizadas na fase INVOKE_APPLICATION, após UPDATE_MODEL_VALUES (onde os setters são chamados). Colocar ações dentro de um getter implica que este será chamado logo no começo, na RESTORE_VIEW, antes de qualquer propriedade do managed bean seja setado.

Desconsiderar esse fato, pode causar bugs inesperados.

dansouza

Em um outro fórum (MyFaces), um cara lá disse que se eu estivesse usando o JSF 1.2 poderia usar a anotação “@PostConstruct”:

@PostConstruct
public void findAllProducts() {
  this.produtos = RepositorioDeProdutos.getTodosOsProdutos();  
}

public List<Produto> getProdutos() {  
  return this.produtos;  
}

Assim o método de “list” seria invocado após o construtor e após as injeções de dependência.
Seria esse um caminho viável?

[]'s

ricardo13

olá dansouza.

Eu to tentando configurar meu ambiente para que o Spring 2.5, JSF 1.2, Tomahawk 1.6 e Tomcat 6.0.26 funcionem, mas tá extremamente complicado.
A aplicação não “sobe” e lança exceções.

Por acaso vc tem a lista de JARs necessária para este ambiente ??
Ou se pode me ajudar a fazer rodar ??

Ricardo

dansouza

Ricardo,

A época que mexi com essa configuração o meu maior problema foram os filtros.
O meu web.xml do começo do post tem as configurações. Dava um monte de erros e não subiam.
Quando acertei os filtros, passou a funcionar.

[]'s

ricardo13

Cara, to perdendo o 3º dia só para configurar e nada !!!

vou mandar meu web.xml e quem sabe talvez vc possa me ajudar.

<?xml version="1.0"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
                         "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
	
	<context-param>
		<param-name>facelets.DEVELOPMENT</param-name>
		<param-value>true</param-value>
	</context-param>
 	<context-param>
  		<param-name>javax.faces.DEFAULT_SUFFIX</param-name>
  		<param-value>.xhtml</param-value>
 	</context-param> 	
 	<context-param>
  		<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
 	 	<param-value>server</param-value>
 	</context-param>
 	
 	<filter>
		<filter-name>MyFacesExtensionsFilter</filter-name>
		<filter-class>org.apache.myfaces.webapp.filter.ExtensionsFilter</filter-class>
    	<init-param>
        	<param-name>uploadMaxFileSize</param-name>
        	<param-value>20m</param-value>
        	<description>Set the size limit for uploaded files.
            	Format: 10 - 10 bytes
                    10k - 10 KB
                    10m - 10 MB
                    1g - 1 GB
        	</description>
    	</init-param>
	</filter>

	<filter-mapping>  
		<filter-name>MyFacesExtensionsFilter</filter-name>  
    	<servlet-name>Faces Servlet</servlet-name>  
   	</filter-mapping>  
   	<filter-mapping>  
    	<filter-name>MyFacesExtensionsFilter</filter-name>  
    	<url-pattern>/faces/myFacesExtensionResource/*</url-pattern>  
   	</filter-mapping>
 	
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	<listener>
		<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
	</listener>
	
 	<servlet>
  		<servlet-name>Faces Servlet</servlet-name>
  		<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
  		<load-on-startup>1</load-on-startup>
 	</servlet>
 	
 	<servlet-mapping>
  		<servlet-name>Faces Servlet</servlet-name>
  		<url-pattern>*.jsf</url-pattern>
 	</servlet-mapping>
 	
 	<welcome-file-list>
  		<welcome-file>index1.xhtml</welcome-file>
	</welcome-file-list>

</web-app>

Se você tiver os JARs necessários também, estou desconfiando que tem mais do que o necessário.

Ricardo

dansouza

Ricardo,

Eu não tenho mais esse projeto em mãos, pois saí da empresa em que desenvolvi essa solução.
Mas eu lembro também que dava uns paus malucos se eu não usasse o JSF-MyFaces.
Testa aí a implementação my-faces ao invés da da Sun.

Pq agora não vou lembrar mesmo as configurações. :frowning:

Criado 18 de setembro de 2008
Ultima resposta 12 de nov. de 2010
Respostas 8
Participantes 4