Dúvida JSF - Spring responsável pelos managed-beans

13 respostas
fabio.massa

Amigos,

Criei um novo projeto do tipo Dynamic Web Project, estava utilizando JSF e o hibernate, agora quero integrar com o Spring, a parte do banco de dados está ok, tudo funcionando perfeitamente, porém gostaria de deixar o spring responsável pelos meus managed-beans do JSF, utilizei a annotation @Qualifier(“meuBean”) e funcionou corretamente, porém veio uma dúvida em relação as propriedades:

<managed-bean>
   <managed-bean-name>meuBean</managed-bean-name>
     <managed-bean-class>br.com.dominio.handler.MeuHandler</managed-bean-class>
     <managed-bean-scope>session</managed-bean-scope>
     <managed-property>
       <property-name>algumId</property-name>
       <value>#{param.algumId}</value>
     </managed-property>
</managed-bean>

A declaração do nome do meu bean que depois utilizo nas views e o tipo do meu scopo eu consegui com as annotations @Qualifier e @Scope, agora só não sei o que fazer quando preciso passar alguma propriedade como parametro.

Agradeço pela ajuda, abraços!

13 Respostas

D

Seguinte, utilize anotações do 2.5.
Em um context.xml da vida, do Spring, eu teria algo como:

<!-- Identifica os beans anotados com @Service, @Repository, @Controller  -->
	<context:component-scan base-package="meupacote.controller" />


	<!-- Habilita a configuracao de beans via anotacoes
	sem a necessidade de usar PersistenceAnnotationBeanPostProcessor,
	AutowiredAnnotationBeanPostProcessor e etc
	 -->
	<context:annotation-config />

No faces-config.xml teria algo como e apenas:

<application>

  <!-- Configura o Facelets -->
  <view-handler>com.sun.facelets.FaceletViewHandler</view-handler>
  <!-- Configura o Spring 2.5 para trabalhar com JSF 1.2 -->
  <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
 </application>
E nas classes controladoras do JSF, algo assim:
@Controller("userController")
@Scope("session")
public class UserController {

	@Resource
	private DaoGeneric<User, Integer> userDao;

Qualquer dúvida, veja a documentação do Spring:
http://www.springsource.org/documentation

Ou em livro, como Dominando Java Server Faces e Facelets Utilizando Spring 2.5, Hibernate e JPA:
http://www.lcm.com.br/index.php?Escolha=20&Livro=L00639

E revistas como a Mundo Java n.º 33 desse mês:
http://www.mundojava.com.br/NovoSite/destaque.shtml

Ou a Java Magazine:
http://www.devmedia.com.br/resumo/default.asp?ed=65&site=6

fabio.massa

Falae djemacao blz?

Já tenho configurado tudo que me falou, mais a dúvida ainda persiste quanto o que fazer com as propriedades do bean, como alguns params etc.
Procurei a java magazine agora mas ainda não chegou na banca, vou ficar atrás dela, parece muito interessante.
Valew pela ajuda cara, qualquer novidade eu lhe falo.

Abraços,

D

Se quiser entender na prática, compra o livro que citei, lá você aprende a lidar com parâmetros e etc. Acho que, se procura um bom exemplo prático, será uma bom começo.
Bons códigos!

rponte

Como você está utilizando anotações eu aconselho partir para o método tradicional,

String id = FacesContext.getCurrentInstance().getExternalContext().getParameterMap().get("contractId"); // deve ser algo assim, fiz de cabeça.

Ou se não for problema, você poderia se utilizar do Restfaces.
Abraços e boa sorte.

fabio.massa

Fala rponte!

Temporariamente eu estava fazendo do jeito que me falou, mas como não achei nenhuma solução decidi deixar configurado no faces-config mesmo, pelo menos até que encontre uma solução para isso.
Agradeço muito pela ajuda, abraços!

D

Fabio,

Vc conseguiu resolver esta questão?

Obrigado

fabio.massa

Falae danielssribeiro blz?
Então para as propriedades que eu passava como parametro por algum link eu resolvi sim:

&lt;a4j:actionparam name="parametro" value="123" assignTo="#{meuBean.parametro}"/&gt;

Aí consegui retirar a configuração do meu managed-bean do xml, deixando o spring responsável por ele.

Qualquer dúvida pode me perguntar!
Abraços,

D

Blz Fábio,

Agora que entendi o que precisava realmente.

Me diz uma coisa, vc consegue controlar todos os seus MBeans pelo Spring sem problemas? Sabe me dizer qual a diferença do gerenciamento do JSF para o Spring? Estou estudando um refactory em um projeto que temos alguns spring beans, mas todos os MBeans são gerenciados pelo faces. Queria mudar o gerenciamento dos MBeans para o spring, com o intuito de possibilitar a criação de pointCuts nos seus métodos através do Spring AOP.

Um problema incial que estou tendo é a impossiblidade de levantar os meus MBeans junto com a app. Neste momento, ainda não tenho o contexto do faces que utilizo na construção destes =|

Queria saber a possibilidade destes beans serem instanciados sob demanda, e não todos na subida da app. Ou, caso possível, controlar a ordem do carregamento das classes, fazendo com que o faces suba antes do Spring. Neste caso, nem sei se terei outros problemas =/ terei q analisar…

valeu.
abraço

fabio.massa

Falae danielssribeiro blz?
Ainda não controlamos todos os managed-beans via spring não, mas os novos e a maioria deles já passou por essa refatoração, é que antes tinhamos o managed-beans -> helper -> DAO, vimos que o helper era desnecessário e com o spring injetamos o DAO direto no managed-beans via @AutoWired.
Uma vantagem é que só preciso acessar algum xml para declarar as navigation-rules, só pra isso. Não sei dizer se há uma vantagem de performance deixar o spring cuidando dos managed-beans.
Essa alteração fizemos a pouco tempo, qualquer novidade eu deixo aqui.

Abraços,

D

Fábio,

Sabe se consigo instanciar estes beans por demanda?

fabio.massa

Fala danielssribeiro!
Não sei se entendi bem sua pergunta, você deseja instanciar o bean gerenciado pelo spring em um outro managed-bean por exemplo?, se for só isso eu sei que dá sim.

Abraços,

D

Fábio,

não é bem isso, cara. Na verdade, o meu problema é que os springs beans configurados por anotação (Component) são instanciados quando levanto a minha aplicação. No entanto, fazendo com que os meus MBeans sejam Spring Beans, queria fazer com que eles não sejam instanciados dessa forma, mas sim sob demanda. Qnd na crição da servlet do meu jsp, instanciar o MBean. Não é assim que o jsf faz no seu gerenciamento de beans?

rponte

danielssribeiro:
Fábio,

não é bem isso, cara. Na verdade, o meu problema é que os springs beans configurados por anotação (Component) são instanciados quando levanto a minha aplicação. No entanto, fazendo com que os meus MBeans sejam Spring Beans, queria fazer com que eles não sejam instanciados dessa forma, mas sim sob demanda. Qnd na crição da servlet do meu jsp, instanciar o MBean. Não é assim que o jsf faz no seu gerenciamento de beans?

Simplesmente coloque o escopo como request ou session.

Esse post é muito bom sobre a integração do Jsf+Spring+Jpa, vale a pena dar uma lida com atenção.


Abraços e boa sorte.

Criado 4 de fevereiro de 2009
Ultima resposta 5 de mai. de 2009
Respostas 13
Participantes 4