JSF + Spring

10 respostas
J

PessoALL,

Estou com o seguinte problema.

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.

Alguém tem alguma idéia ?!

10 Respostas

afamorim

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

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>Consultar Usuario</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 -->
	<bean id="transactionManager"
		class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>
 
	<!-- UsuarioDAO Service Definition -->
	<bean id="cadastroService" class="model.service.impl.CadastroServiceImpl">
		<property name="usuarioDao" ref="UsuarioDao"/>
	</bean>
 
	<!-- Transactional proxy for UsuarioDAO -->
	<bean id="service"
		class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" >
		<property name="transactionManager" ref="transactionManager" />
		<property name="target" ref="cadastroService" />
		<property name="transactionAttributes">
			<props>
				<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
				<prop key="save*">PROPAGATION_REQUIRED</prop>
				<prop key="update*">PROPAGATION_REQUIRED</prop>
				<prop key="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…
:stuck_out_tongue:

J

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.
:smiley:
afinal soria vc esta na Bahia(pelo menos eu estou…)

J

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 :smiley:

J

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…

<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>


<managed-bean>
 		<description>Consulta</description>
 		<managed-bean-name>usuarioBeanConsulta</managed-bean-name>
 		<managed-bean-class>view.bean.UsuarioBeanConsulta</managed-bean-class>
 		<managed-bean-scope>request</managed-bean-scope>
 		<managed-property>
 			<property-name>service</property-name>
 			<value>#{service}</value>
 		</managed-property>
 	</managed-bean>

Obrigado pelas dicas pessoall…

Criado 22 de março de 2007
Ultima resposta 23 de mar. de 2007
Respostas 10
Participantes 3