Vraptor - Dao acessar outro Dao , tem problema?

Tenho esta dúvida , nem sei se é problema do Vraptor ou do Hibernate ou sei lá … Tenho no meu projeto uma classe agenda que a chave não é auto incrementavel , e tenho a classe dser que serve para gerar a chave de várias tabelas . Eu preciso de no dao da agenda acessar o dao da dser usando o método loadById , passando o nome do objeto (“AGC”) e o estabelecimento ( 0 ) , ele irá me retornar o nº da ultima chave utilizada … Tudo bem a implementação disso não é o problema por equanto , mas sim se é possivel acessar um dao de outro dao , pois fiz um teste e não deu :

AgendaDao:

@SuppressWarnings("null")
	public int CarregaNumCod() {
		Integer dserEst = 0;
		String dserPar = "AGD";
		DserRepository dserRepo = null ;			
		return dserRepo.findById(dserEst, dserPar); 
}

DserDao

	public Integer findById(Integer dserEst, String dserPar) {
//		Query query = manager.createQuery("select e.dserserial from Dser e where e.id.dserest = 0 and e.id.dserpar = 'AGD'");
//		return ((Long) query.getSingleResult()).intValue();		//Este treicho comentado funciona 
		return  45;
	}	

E o erro que ocorre é sempre:

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

br.com.caelum.vraptor.InterceptionException: exception raised, check root cause for details: java.lang.NullPointerException
	br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:96)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.util.jpa.JPATransactionInterceptor.intercept(JPATransactionInterceptor.java:51)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:23)
	br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58)
	br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
	com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent(SiteMeshFilter.java:129)
	com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:77)

root cause

java.lang.NullPointerException
	dao.AgendaDao.CarregaNumCod(AgendaDao.java:80)
	controller.AgendaController.novo(AgendaController.java:64)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	java.lang.reflect.Method.invoke(Unknown Source)
	br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:61)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.util.jpa.JPATransactionInterceptor.intercept(JPATransactionInterceptor.java:51)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:23)
	br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58)
	br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
	com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent(SiteMeshFilter.java:129)
	com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:77)

note The full stack trace of the root cause is available in the Apache Tomcat/7.0.25 logs.

E nesta linha que ele esta reclamando (dao.AgendaDao.CarregaNumCod(AgendaDao.java:80)) é esta return dserRepo.findById(dserEst, dserPar);

Alguem tem ideia ?

cara vc deve declarar a sua variável dser e injeta-la no construtor da classe AgendaDao ficando assim:

AgendaDao

private final Dser dser;

public AgendaDao(Dser dser) {
   this.dser = dser;
}

[quote=fabio.cbrandao]cara vc deve declarar a sua variável dser e injeta-la no construtor da classe AgendaDao ficando assim:

AgendaDao

[code]
private final Dser dser;

public AgendaDao(Dser dser) {
this.dser = dser;
}
[/code][/quote]

Não entendi , porque declarar a classe Dser no AgendaDao , eu nem uso a classe Dser neste Dao !

Você percebeu que na linha anterior a variável “dserRepo” foi configurada com o valor “null”?

    @SuppressWarnings("null")  
        public int CarregaNumCod() {  
            Integer dserEst = 0;  
            String dserPar = "AGD";  
            DserRepository dserRepo = null ;              
            return dserRepo.findById(dserEst, dserPar);   
    }  

[quote=mathiasnw]Você percebeu que na linha anterior a variável “dserRepo” foi configurada com o valor “null”?

@SuppressWarnings("null") public int CarregaNumCod() { Integer dserEst = 0; String dserPar = "AGD"; DserRepository dserRepo = null ; return dserRepo.findById(dserEst, dserPar); } [/quote]

é eu tbm não tinha nem percebido!

[quote=mathiasnw]Você percebeu que na linha anterior a variável “dserRepo” foi configurada com o valor “null”?

@SuppressWarnings("null") public int CarregaNumCod() { Integer dserEst = 0; String dserPar = "AGD"; DserRepository dserRepo = null ; return dserRepo.findById(dserEst, dserPar); } [/quote]

O Eclipse reclama se eu não inicializar o dserRepo e sugere que coloque este null . E ele não aceita DserRepository dserRepo = new DserRepository();

[quote=adrianohardcore][quote=mathiasnw]Você percebeu que na linha anterior a variável “dserRepo” foi configurada com o valor “null”?

@SuppressWarnings("null") public int CarregaNumCod() { Integer dserEst = 0; String dserPar = "AGD"; DserRepository dserRepo = null ; return dserRepo.findById(dserEst, dserPar); } [/quote]

O Eclipse reclama se eu não inicializar o dserRepo e sugere que coloque este null . E ele não aceita DserRepository dserRepo = new DserRepository();[/quote]

Faz isso então

    private final DserRepository dserRepo;  
      
    public AgendaDao(DserRepository dserRepo) {  
       this.dserRepo = dserRepo;  
    }  

[quote=fabio.cbrandao][quote=adrianohardcore][quote=mathiasnw]Você percebeu que na linha anterior a variável “dserRepo” foi configurada com o valor “null”?

@SuppressWarnings("null") public int CarregaNumCod() { Integer dserEst = 0; String dserPar = "AGD"; DserRepository dserRepo = null ; return dserRepo.findById(dserEst, dserPar); } [/quote]

O Eclipse reclama se eu não inicializar o dserRepo e sugere que coloque este null . E ele não aceita DserRepository dserRepo = new DserRepository();[/quote]

Faz isso então

[code]
private final DserRepository dserRepo;

public AgendaDao(DserRepository dserRepo) {  
   this.dserRepo = dserRepo;  
}  

[/code][/quote]

Obrigado , deu certo ! Só não entendi o porque de fazer isto , pois queria simplesmente chamar um método e receber o valor por variavel.Isto é especifico do Vraptor né ? Agora , independente da implementação, qual seria o local correto de fazer uma pesquisa em outra tabela/classe , seria do jeito que eu fiz , no Dao correspondente a classe que estou usando?

Cara o pq disso é como vc disse é específico do vraptor mesmo, isso chama injeção de dependência, assim como vc injeta o DAO no Controller da sua aplicação vc teve a necessidade de utilizar um DAO dentro de outro DAO então é necessário injetá-lo. Agora eu não entendi pq vc está fazendo isso. Pq vc não chama direto o dserRepo.findById(0, “AGD”); ao invés de chamar o AgendaDao.CarregaNumCod();

OBS: não esqueça dos padrões java carregaNumCod(); “COMEÇA MINÚSCULO”

[quote=fabio.cbrandao]Cara o pq disso é como vc disse é específico do vraptor mesmo, isso chama injeção de dependência, assim como vc injeta o DAO no Controller da sua aplicação vc teve a necessidade de utilizar um DAO dentro de outro DAO então é necessário injetá-lo. Agora eu não entendi pq vc está fazendo isso. Pq vc não chama direto o dserRepo.findById(0, “AGD”); ao invés de chamar o AgendaDao.CarregaNumCod();

OBS: não esqueça dos padrões java carregaNumCod(); “COMEÇA MINÚSCULO”[/quote]

Obrigado pela resposta , estou chamando o dserRepo.findById(0, "AGD"); dentro de AgendaDao.CarregaNumCod e depois de receber o resultado , por exemplo 50 , vou verificar se já tem algum registro de agenda com código 50 , se tiver , procuro o próximo registro limpo.Seria mais fácil usar o auto increment na tabela Agenda , mais estou usando um banco de dados já existente e não posso mudar a estrutura.Resumindo AgendaDao.CarregaNumCod não esta pronto.

No caso no meu AgendaDao eu usava a injeção de dependência para receber EntityManager somente . Como estou usando injeção de dependência nesta classe , tudo que eu for instanciar nessa classe eu terei que usar injeção de dependência também , ou no caso só se aplica a classe que tiver anotada com @Component ?

a idéia é que todo mundo que é @Component, @Resource, @Intercepts (ou qqer outra anotação do VRaptor) vai receber as dependências pelo construtor, daí vc não precisa se preocupar com a criação das classes.

[quote=Lucas Cavalcanti]a idéia é que todo mundo que é @Component, @Resource, @Intercepts (ou qqer outra anotação do VRaptor) vai receber as dependências pelo construtor, daí vc não precisa se preocupar com a criação das classes.

[/quote]

Obrigado , no caso não ha problema em um dao acessar outro não né , mas isso poderia ser considerado uma gambiarra ? Qual é o melhor procedimento a fazer quando se precisa fazer uma pesquisa ou uma inserção em uma tabela/classe diferente a qual você esta implementando ?

não há problema um DAO referenciar o outro…

o que vc precisa ver é se vc está fazendo alguma regra de negócio dentro do dao que deveria estar em outro lugar.