Spring : No Bean Named

23 respostas
C

Pessoal estou tendo este erro quando executo o jar que exportei no eclipse

Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitio nException: No bean named 'daoImpressaoPostgre' is defined at org.springframework.beans.factory.support.DefaultListableBeanFactory. getBeanDefinition(DefaultListableBeanFactory.java:388) at org.springframework.beans.factory.support.AbstractBeanFactory.getMerg edLocalBeanDefinition(AbstractBeanFactory.java:976) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBe an(AbstractBeanFactory.java:245) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:184) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:163) at org.springframework.context.support.AbstractApplicationContext.getBea n(AbstractApplicationContext.java:881) at br.brasif.servico.ServicoParam.main(ServicoParam.java:125)

o estranho é que quando executo a classe dentro do eclipse não da o erro, tudo funciona normalmente.

23 Respostas

A

Essa exceção não tem nenhum “caused by” em algum lugar do stack trace? Pode ser por falta de definição do Driver (o Eclipse ajusta o classpath pra vc, mas se vc tentar rodar o WAR sem a biblioteca, pode dar uma exceção assim).

[]´s

L

Sem exportar funciona?

Está exportando os jars?

R

Voce tentou pegar um bean que nao está definido… daoImpressaoPostgre

Voce configurou corretamente a leitura do seu XML de configuracao?

Manda o código do seu main pra gente ver…

as vezes vc deviniu o bean como daoImpressaoPostgres também

C

Esse stackTrace é tudo que ele imprime.

Rodando dentro do eclipse funciona

R

Manda o código do main aí…

E seu xml de configuracao

C

Classe Main

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		
		/**
		 * Alertas
		 */
		if (args[0].equals("A")){
			
			XMLAlerta xmlAlerta = new XMLAlerta() ;
			
			IDaoAlerta daoAlerta = (IDaoAlerta)applicationContext.getBean("daoAlertaPostgre"); 
			
			List<Alerta> alertas =  xmlAlerta.parse(arquivo) ;			

			for (Alerta alerta : alertas){						
				
				if (alerta != null)
					daoAlerta.executarProcedure(alerta);					
				
			}
			
		}

Arquivo XML

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop"
		xmlns:context="http://www.springframework.org/schema/context" xmlns:jee="http://www.springframework.org/schema/jee"
		xmlns:tx="http://www.springframework.org/schema/tx"
		xsi:schemaLocation="
			http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
			http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
			http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
			http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd
			http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
		
	<!-- Sessao do Hibernate  -->
	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" destroy-method="destroy">
		
		<property name="configLocation">
			<value>classpath:hibernate-postgre.cfg.xml</value>
		</property>
	
	</bean>
	
	<!-- DAO -->	
	<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
		<constructor-arg ref="sessionFactory"></constructor-arg>
	</bean>
		
	<!-- Annotation -->
	<context:annotation-config></context:annotation-config>
	<context:component-scan base-package="br.brasif"></context:component-scan>
	
	<!--  AOP   --> 
    <aop:aspectj-autoproxy />
	
	<!-- enable the configuration of transactional behavior based on annotations -->
	<tx:annotation-driven transaction-manager="transactionManager"/>

	<!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) -->
	<bean id="transactionManager"
		class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory">
			<ref local="sessionFactory" />
		</property>
	</bean>
		
	<import resource="configuracao.xml" />
		  
</beans>
L

Está faltando o configuração.xml… posta ele ai tb.

C

eu configurei com annotation, agora uma coisa que não sei se é o problema,

tenho uma Interface IDaoAlerta e duas classes DaoAlerta e DaoAlertaPostgre que implementam essa interface.

Classe DaoAlerta

@Repository("daoAlertaPostgre")
public class DaoAlertaPostgre implements IDaoAlerta {

}

Classe DaoAlertaPostgre

@Repository("daoAlerta")
public class DaoAlerta implements IDaoAlerta {
}

Na minha Classe não ServicoAlerta fiz assim paga pegar a instancia

@Autowired
	@Qualifier("daoAlerta")
	private IDaoAlerta daoAlerta ;

e na classe ServicoParam faço assim

IDaoAlerta daoAlerta = (IDaoAlerta)applicationContext.getBean("daoAlertaPostgre");

Erro quando rodo o jar

Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitio
nException: No bean named 'daoAlertaPostgre' is defined
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.
getBeanDefinition(DefaultListableBeanFactory.java:388)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getMerg
edLocalBeanDefinition(AbstractBeanFactory.java:976)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBe
an(AbstractBeanFactory.java:245)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean
(AbstractBeanFactory.java:184)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean
(AbstractBeanFactory.java:163)
        at org.springframework.context.support.AbstractApplicationContext.getBea
n(AbstractApplicationContext.java:881)
        at br.brasif.servico.ServicoParam.main(ServicoParam.java:69)
C

No configuracao.xml não tem nenhuma configuração de mapeamento de Bean, são só parametros de envio de e-mail.

A

Você reparou que a exceção é lançada como “daoImpressaoPostgre” não encontrado e você mapeou um “daoAlertaPostgre” , né?

[]´s

R

Acho que o <context:component-scan base-package=“br.brasif”> nao tá lendo sua classe…

No log… tem uma linha que fala assim

Pre instantiating singletons… e vem todos os beans da fábrica… posta essa linha…

C

a Exceção é a mesma tanto pro “daoImpressaoPostgre” e pro “daoAlertaPostgre”.

Qual linha tu ta falando de ?

Pre instantiating singletons.. e vem todos os beans da fábrica... posta essa linha...
A
O pacote da classe DaoAlertaPostgre começa com br.brasif ?

[]´s

R

Tem uma linha no log tipo essa:

INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@889ec59: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor, org.springframework.context.annotation.internalAutowiredAnnotationProcessor, org.springframework.context.annotation.internalRequiredAnnotationProcessor, org.springframework.context.annotation.internalCommonAnnotationProcessor, mostraInformacoesSistema,sistema]; root of factory hierarchy
R

Estou tendo o mesmo problema, dentro do eclipse funciona normal, na hora q exporto os jars (exportei um jar gordo e um monte de jar e deu o mesmo problema)
ele não funciona os componentes anotados!

@rogelgarcia nessa linha do log não aparece nenhum dos beans anotados

R

Sua aplicacao é web… ou desktop?

R

A minha é desktop

R

Hum… provavelmente é problema de classpath…

As classes suas estao no classpath da aplicacao?

Tente fazer uma classe Main e de dentro dela… usa qualquer uma dessas classes que vc diz que nao estao sendo mapeadas… e ve se dá pau no programa

R

é uma classe só, no meu caso não uso interface, mas como eu disse no eclipse funciona numa boa.

fiz o teste que você sugeriu e continua dando o problema quando exporto o jar

Exception in thread “main” org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named ‘PrincipalTask’ is defined

lembrando q exporto como runnable jar no eclipse (ele faz aquele jar gordo que contém todas as classes do classpath)

e também exportei um jar normal, peguei todas as dependências e executei um comando java -classpath definindo o classpath
acredito que ambos estão na maneira correta

Inclusive no log aparece:
INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@134f69a: defining beans [org.springframework.context.annotation.internalCommonAnnotationProcessor,
org.springframework.context.annotation.internalAutowiredAnnotationProcessor,
org.springframework.context.annotation.internalRequiredAnnotationProcessor
,
dataConfigPropertyConfigurer,dataSource,txManager,sqlMap,mailSender,
org.springframework.aop.config.internalAutoProxyCreator, org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0,
org.springframework.transaction.interceptor.TransactionInterceptor#0,
org.springframework.transaction.config.internalTransactionAdvisor]; root of factory hierarchy

a parte em negrito indica que ele está entendendo que eu quero configuração por anotação. Só que as classes anotadas niente do spring perceber.

R

ah, acho que não ficou claro
no teste que você sugeriu (de instanciar na mão a classe)
ele istanciou na boa, indicando que a classe está no classpath sim!

R

Achei a solução:

http://www.techinfopad.com/spring/100105844-componentscan-not-working-in-web-application.html

nesse site o cara diz q é um problema do eclipse
q na hora de exportar tem q selecionar a opção "add directory entries"
eu fiz aqui e reconheceu os beans!

agora tenho q descobrir WTF é isso

R

Só pra adicionar a solução:

Qdo vc faz isso, pelo que entendi, o compactador indica quais pastas tem subdiretórios e tal.
Peguei um jar gerado pelo eclipse, descompactei e compactei de novo e funcionou.

Também fiz outro teste, qdo vc faz export Runnable jar no eclipse, existe uma opção para fazer um script do ant q faz isso pra você
quando vc faz pelo ANT ele faz direitinho, tudo funcionando.

Então faça um script do ANT pra gerar seu jar q não terá problemas.

R

Muito bom cara… eu nem sabia desse directory entries…

valew!!

Criado 16 de março de 2010
Ultima resposta 26 de mar. de 2010
Respostas 23
Participantes 5