Eu tenho um backbean que está sendo utilizando como superclasse. Nele tenho alguns métodos que gostaria de utilizar nas minhas classes. Inclusive um atributo que está sendo injetado pelo Spring.
Estou querendo utilizar esse atributo injetado na classe filha. Porém, quando tento acessar, recebo um NPE.
O que está acontecendo é que o SPring não injeta o atributo quando estou utilizando um método de acesso na classe filha através de herança.
A configuração está funcionando perfeitamente, pois já fiz os testes na superclasse.
Rapaz eu faço isso direto e funciona, observe apenas se os set’s estão como public na sua super classe, o spring usa reflexão para fazer isso então basta que localise o seu set que tudo funcionará perfeitamente.
para vc testar basta vc colocar um set na sua classe filha do atributo que vc quer modificar
tipo
setParametro(Strign p){
super.setParametro(p);
}
se isso compilar pode colocar no spring que vai funcionar.
urubatan
bahh, normalmente não precisa não …
tu pode postar aqui a parte do XML onde o bean esta registrado no spring e/ou JSF?
valeus …
J
Javas_Man
Segue aí…
faces-config.xml
<application><!-- Biblioteca responsável por visualizar os beans do Spring - versão Spring 2.0 --><variable-resolver>org.springframework.web.jsf.DelegatingVariableResolver
</variable-resolver><locale-config><default-locale>pt_BR</default-locale></locale-config><message-bundle>view.bundle.Messages</message-bundle></application><managed-bean><description>SuperClass</description><managed-bean-name>UsuarioBean</managed-bean-name><managed-bean-class>view.bean.UsuarioBean</managed-bean-class><managed-bean-scope>request</managed-bean-scope><managed-property><property-name>service</property-name><value>#{service}</value></managed-property></managed-bean><!-- Classe herdeira --><managed-bean><description>ConsultarUsuario</description><managed-bean-name>UsuarioBeanConsultar</managed-bean-name><managed-bean-class>view.bean.UsuarioBeanConsultar
</managed-bean-class><managed-bean-scope>request</managed-bean-scope></managed-bean
Agora o meu applicaionContext
<!-- Spring Transaction --><beanid="transactionManager"class="org.springframework.orm.hibernate3.HibernateTransactionManager"><propertyname="sessionFactory"ref="sessionFactory"/></bean><!-- UsuarioDAO Service Definition --><beanid="cadastroService"class="model.service.impl.CadastroServiceImpl"><propertyname="usuarioDao"ref="UsuarioDao"/></bean><!-- Transactional proxy for UsuarioDAO --><beanid="service"class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"><propertyname="transactionManager"ref="transactionManager"/><propertyname="target"ref="cadastroService"/><propertyname="transactionAttributes"><props><propkey="get*">PROPAGATION_REQUIRED,readOnly</prop><propkey="save*">PROPAGATION_REQUIRED</prop><propkey="update*">PROPAGATION_REQUIRED</prop><propkey="delete*">PROPAGATION_REQUIRED</prop></props></property></bean>
Na minha superclasse tem um método que eu passo um parâmetro. E eu gostaria que as classes filhas herdassem este método. Nesse caso, o UsuarioBeanConsultar irá herdar o método service de UsuarioBean.
Valeu !!!
afamorim
Se mais vc não passou o service para o filho!!
cade?
ou vc esta dizendo que passou para a classe pai e ja quer que outro objeto que esta estanciado em outra posição da memoria herde as informações, deixou de ser java e virou magia…
J
Javas_Man
Se você observar no faces-config, o service está no pai. E estou querendo que ele seja visto pelas classes filhas… nada demais… magia para mim é reflexão, isso aqui é só brincadeira…
urubatan
seguinte, o que esta escrito no teu faces config, traduzido para java é o seguinte:
view.bean.UsuarioBean UsuarioBean = new view.bean.UsuarioBean();
UsuarioBean.setService(codigoQueBuscaServiceDoSpring);
view.bean.UsuarioBeanConsultar UsuarioBeanConsultar = new view.bean.UsuarioBeanConsultar ();
o seja, a variavel UsuarioBeanConsultar não teve a propriedade service setada …
herança de classes, não propaga as propriedades para outras instancias, nem da mesma classe, quanto mais para instancias de subclasses …
PS.: faça um favor para si mesmo, os nomes dos mbeans são nomes de variaveis, então, por favor, a primeira letra em minusculo …
afamorim
Uma boa forma de vc ver isso é entendo como funciona na memoria, quando vc instancia um objeto ele ocupa uma posição na memoria se vc estancia outro é outra posição na meomoria, mesmo que o objetos sejam do mesmo tipo ele vão ter estados diferentes
O core java da uma explicação muito boa.
ps: a piada da magia foi so p/ quebrar o gelo.
afinal soria vc esta na Bahia(pelo menos eu estou…)
J
Javas_Man
Já consegui colocar para funcionar. Eu fiz isso.
public UsuarioBean() { ApplicationContext contexto = new ClassPathXmlApplicationContext( "applicationContext.xml"); service = (CadastroService) contexto.getBean("cadastroService"); }
Vejam o que fiz… funciona !
Mas, gostaria de saber se o spring teria algum listner para ficar verificando se existe algum método a ser injetado na super classes quando a instanciarmos.
urubatan
yeap, tem sim, o nome disto no sprig é autowire-byname
da uma olhada nos exemplos que existem sobre o spring-annotation no meu blog, quase todos os exemplos usam isto
J
Javas_Man
Tchurma, obrigado pelas dicas…
Mas resolvi da seguinte forma. Como os beans JSF herdam do SuperBean, eu coloquei como propriedade dos beans que herdam, o método #{service}. Funcionou. Então, não precisei colocar o autowire no Spring, não chamar via método público. Acho que ficou melhor assim…