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 ?
JSF e Spring!
16 Respostas
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>
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…
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.
hummmm vou ler mais a respeito, acho q eh por ai mesmo amigo, vlw !!
Você está declarando seus beans do JSF pelo Spring???
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 ) ?
Eu injeto desta maneira:
@Resource(name="nomeDoServiceDeclarado")
private interfaceDoSeuServiceseuService;
Não fica mais fácil??
O arquivo onde a classe é injetada esta marcador com @component?
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 ?
acabei de confirmar com um amigo aki colocar autowire em cima do contrutor faz a injeção pelo contrutor mesmo testa quando puder.
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();
...
}
}
testa la e depois posta
vou testar apos o almoco e já posto o resultado. Pessoal muito obrigado pelas dicas !
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.
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 ?
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 !!!