JSF e Spring!

16 respostas
muldon

pessoal, dúvida basica. Tenho meu Back Bean do jsf e quero acessar um servico ( q eh uma propriedade do meu Back Bean ) e preciso q esse servico seja injetado pelo spring. Como eu faco pra ter esse servico injetado pelo spring no construtor do meu back bean ? Ja li algo sobre autowire=“constructor” mas nenhum exemplo. Como vcs resolveram isso ?

16 Respostas

Diabo_Loiro

Entao se o teu serviço tiver marcado como componente ou service ele ja deve injetar automatico com autowire, porem tem a opção do xml.

ali esta passando uma String, se usar passa outro objeto;

<bean id="provider" 

      class="com.apress.prospring.ch4.ConfigurableMessageProvider">

	<constructor-arg>

		<value> This is a configurable message </value>

	</constructor-arg>

</bean>
muldon

entao parceiro, eu ja uso a configuracao do bean com autowire=“byName”. Mas acontece q o servico so eh injetado depois da chamada do construtor. Colocar a anotacao como servico resolve a injecao no momento da chamada do construtor ? Ja tentei e nao consegui, gostaria de algum exemplo se alguem tiver…

Diabo_Loiro

parece que voce tem colocar a anotação em cima do construtor…

segue exemplo.
http://springindepth.com/book/in-depth-ioc-autowiring.html

se não der tenta o xml.

muldon

hummmm vou ler mais a respeito, acho q eh por ai mesmo amigo, vlw !!

D

Você está declarando seus beans do JSF pelo Spring???

muldon

sim, estou declarando no spring e deixando a configuracao tal que o spring gerencie os beans. Tem um exemplo ai de como isso eh feito de forma q o construtor tenhas as variaveis de instancia injetadas ( servico no caso ) ?

D

Eu injeto desta maneira:

@Resource(name="nomeDoServiceDeclarado")
  private interfaceDoSeuServiceseuService;

Não fica mais fácil??

Diabo_Loiro

O arquivo onde a classe é injetada esta marcador com @component?

muldon

nossa Daniel.F beeeemmm mais facil heim. Mas essa annotation deve ficar logo acima da variavel de instancia ? Essa declaracao dessa forma injeta o bean no momento do construtor do Back Bean ? So estou perguntando pq nao tenho como testar aqui onde estou, mas to muito curioso !!! Sei tb q tem uma configuracao de component-scan no xml do spring certo ?

Diabo_Loiro

acabei de confirmar com um amigo aki colocar autowire em cima do contrutor faz a injeção pelo contrutor mesmo testa quando puder.

muldon

Diabo Loiro no meu caso nao, pois se trata de um Back Bean. Deveria eu entao colocar esse back bean como @Component ? Agora com tantas sugestoes estou confuso de como deveria ficar no final das contas. Seria isso ?

...

@Component
public class MeuBackBean {

    @Resource(name="meuServicoImpl")  
    public IMeuServico meuServico;

    public MeuBackBean(){
          meuServico.carregaListas();
          ...
    }



}
Diabo_Loiro

testa la e depois posta

muldon

vou testar apos o almoco e já posto o resultado. Pessoal muito obrigado pelas dicas !

D

No seu caso vc tem que chamar o carregar lista após a injeção, então proceda da seguinte forma:

@Component
public class MeuBackBean {

    @Resource(name="meuServicoImpl")  
    public IMeuServico meuServico;

    public MeuBackBean(){
          meuServico.carregaListas();
          ...
    }
@PostConstruct // Esta anotação chama o metódo após a injeção 
    public void carregaListas(){

meuServico.carregaListas();

}


}

Qualquer coisa, fala ai, mas que que resolve.
Você tem que configurar para scanear o pacote que contém a implementação de seu service, com anotação @Component.

muldon

ae pessoal, testei tudo aqui e consegui a injecao com o autoriwed da seguinte forma:

@Component
public class MenuBean 
{
     public IAdminApplicationService adminAppService;

    public void setAdminAppService(IAdminApplicationService adminAppService) {
		this.adminAppService = adminAppService;
	}

   ...
     
 @Autowired
	public MenuBean(IAdminApplicationService adminAppService){
		adminAppService.teste();
		//chama servico ok !
	}
    ...  
}

no entanto se eu chamar qualquer outro metodo dentro do construtor, no outro metodo o servico esta nulo. Testei @Resource(name=“adminAppService”) em cima da variavel mas nada acontece. Testei de varias formas. Resolveu parte do meu problema, mas ainda me sinto limitado quanto ao acesso a esse bean, que esta ficando nulo fora do construtor. Sugestoes ?

muldon

pessoal, acabei de “resolver” o problema da seguinte forma:

@Component
public class MenuBean extends AbstractBackBean
{
     //public IAdminApplicationService adminAppService;
    // servico esta agora na classe pai abstrata
    
   ...
     
 @Autowired
	public MenuBean(IAdminApplicationService adminAppService, ){
                this.adminAppService = adminAppService;
		//disponibilizando servico para todo os metodos  na classe pai que possui a propriedade de instancia
                adminAppService.teste();
		//chama servico ok !
	}
    ...  
}

ainda acredito haver maneiras melhores de ter a instancia do servico no meu Back Bean no momento do construtor. Gostaria mesmo de saber é como fazer o autoriwed nao precisar receber meus N servicos como parametros no construtor para poder injeta-los nos beans. Se alguem souber, sugestoes por favor !!!

Criado 3 de novembro de 2010
Ultima resposta 4 de nov. de 2010
Respostas 16
Participantes 3