Falha na Injeção de dependência [RESOLVIDO]

22 respostas
tefo

eai galera!

estou tentando mas acho que a aplicação não está conseguindo instanciar o dao com injeção de dependência..

resource:
package br.com.website.resource;  
      
@Path("/estado")  
@Resource
public class EstadoResource {  

    private final EstadoDaoInterface dao;

    public EstadoResource(EstadoDaoInterface dao) {
         this.dao = dao;
    }
      
    @Get @Path("/list/{idPais}")  
    @Produces(MediaType.APPLICATION_JSON)  
    public String getListaEstados(@PathParam("idPais") Integer idPais) throws Exception {  
      
    ObjectMapper mapper = new ObjectMapper();  
    String response = "";  
      
    response = mapper.writeValueAsString(dao.listar(idPais));  
      
    return response;  
    }  
}
O que acontece é o seguinte: - neste projeto estou usando vRaptor; - a configuração das injeções de dependências foram feitas exatamente igual a apostila fj-28, tanto que a aplicação quando segue o fluxo do vRaptor acessando um controller o dao está instanciado. - esta classe EstadoResource.java é acessada somente por uma requisição ajax, portanto não passa por nenhum controller antes (não sei se o vRaptor ou o Spring não previam isso ou o mais provável é eu que configurei errado, mas o dao não instancia nesta classe); - ao startar o server surge os seguintes logs no console do Eclipse:
23/07/2012 14:08:54 org.apache.catalina.core.AprLifecycleListener init
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: .:/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java
23/07/2012 14:08:54 org.apache.tomcat.util.digester.SetPropertiesRule begin
AVISO: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:website' did not find a matching property.
23/07/2012 14:08:54 org.apache.coyote.http11.Http11Protocol init
INFO: Initializing Coyote HTTP/1.1 on http-8080
23/07/2012 14:08:54 org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 1381 ms
23/07/2012 14:08:54 org.apache.catalina.core.StandardService start
INFO: Starting service Catalina
23/07/2012 14:08:54 org.apache.catalina.core.StandardEngine start
INFO: Starting Servlet Engine: Apache Tomcat/6.0.30
23/07/2012 14:08:55 org.apache.catalina.core.ApplicationContext log
INFO: Initializing Spring root WebApplicationContext
log4j:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
23/07/2012 14:09:04 com.sun.jersey.api.core.PackagesResourceConfig init
INFO: Scanning for root resource and provider classes in the packages:
  br.com.website.resource
23/07/2012 14:09:04 com.sun.jersey.api.core.ScanningResourceConfig logClasses
INFO: Root resource classes found:
  class br.com.website.resource.EstadoResource
  class br.com.website.resource.CidadeResource
23/07/2012 14:09:04 com.sun.jersey.api.core.ScanningResourceConfig init
INFO: No provider classes found.
23/07/2012 14:09:04 com.sun.jersey.server.impl.application.WebApplicationImpl _initiate
INFO: Initiating Jersey application, version 'Jersey: 1.4 09/11/2010 10:30 PM'
23/07/2012 14:09:05 com.sun.jersey.spi.inject.Errors processErrorMessages
GRAVE: The following errors and warnings have been detected with resource and/or provider classes:
  SEVERE: Missing dependency for constructor public br.com.website.resource.EstadoResource(br.com.website.dao.EstadoDaoInterface) at parameter index 0
23/07/2012 14:09:05 org.apache.catalina.core.ApplicationContext log
GRAVE: StandardWrapper.Throwable
com.sun.jersey.spi.inject.Errors$ErrorMessagesException
	at com.sun.jersey.spi.inject.Errors.processErrorMessages(Errors.java:170)
	at com.sun.jersey.spi.inject.Errors.postProcess(Errors.java:137)
	at com.sun.jersey.spi.inject.Errors.processWithErrors(Errors.java:203)
	at com.sun.jersey.server.impl.application.WebApplicationImpl.initiate(WebApplicationImpl.java:695)
	at com.sun.jersey.server.impl.application.WebApplicationImpl.initiate(WebApplicationImpl.java:690)
	at com.sun.jersey.spi.container.servlet.ServletContainer.initiate(ServletContainer.java:438)
	at com.sun.jersey.spi.container.servlet.ServletContainer$InternalWebComponent.initiate(ServletContainer.java:287)
	at com.sun.jersey.spi.container.servlet.WebComponent.load(WebComponent.java:587)
	at com.sun.jersey.spi.container.servlet.WebComponent.init(WebComponent.java:213)
	at com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:342)
	at com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:516)
	at javax.servlet.GenericServlet.init(GenericServlet.java:212)
	at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1173)
	at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:993)
	at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4387)
	at org.apache.catalina.core.StandardContext.start(StandardContext.java:4700)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
	at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
	at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:463)
	at org.apache.catalina.core.StandardService.start(StandardService.java:525)
	at org.apache.catalina.core.StandardServer.start(StandardServer.java:701)
	at org.apache.catalina.startup.Catalina.start(Catalina.java:585)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
23/07/2012 14:09:05 org.apache.catalina.core.StandardContext loadOnStartup
GRAVE: Servlet /website threw load() exception
com.sun.jersey.spi.inject.Errors$ErrorMessagesException
	at com.sun.jersey.spi.inject.Errors.processErrorMessages(Errors.java:170)
	at com.sun.jersey.spi.inject.Errors.postProcess(Errors.java:137)
	at com.sun.jersey.spi.inject.Errors.processWithErrors(Errors.java:203)
	at com.sun.jersey.server.impl.application.WebApplicationImpl.initiate(WebApplicationImpl.java:695)
	at com.sun.jersey.server.impl.application.WebApplicationImpl.initiate(WebApplicationImpl.java:690)
	at com.sun.jersey.spi.container.servlet.ServletContainer.initiate(ServletContainer.java:438)
	at com.sun.jersey.spi.container.servlet.ServletContainer$InternalWebComponent.initiate(ServletContainer.java:287)
	at com.sun.jersey.spi.container.servlet.WebComponent.load(WebComponent.java:587)
	at com.sun.jersey.spi.container.servlet.WebComponent.init(WebComponent.java:213)
	at com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:342)
	at com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:516)
	at javax.servlet.GenericServlet.init(GenericServlet.java:212)
	at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1173)
	at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:993)
	at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4387)
	at org.apache.catalina.core.StandardContext.start(StandardContext.java:4700)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
	at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
	at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:463)
	at org.apache.catalina.core.StandardService.start(StandardService.java:525)
	at org.apache.catalina.core.StandardServer.start(StandardServer.java:701)
	at org.apache.catalina.startup.Catalina.start(Catalina.java:585)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
23/07/2012 14:09:05 org.apache.coyote.http11.Http11Protocol start
INFO: Starting Coyote HTTP/1.1 on http-8080
23/07/2012 14:09:06 org.apache.jk.common.ChannelSocket init
INFO: JK: ajp13 listening on /0.0.0.0:8009
23/07/2012 14:09:06 org.apache.jk.server.JkMain start
INFO: Jk running ID=0 time=0/38  config=null
23/07/2012 14:09:06 org.apache.catalina.startup.Catalina start
INFO: Server startup in 11384 ms

Alguém já teve este problema?

22 Respostas

J

EstadoDao tem um construtor publico sem parrâmetros?

tefo

Opa,

na verdade EstadoDao é uma interface… acabei de mudar o nome para EstadoDaoInterface… aí fica mais facil de perceber…

DaniloAndrade

Boa tarde

cara tem certeza que o erro é nessa classe que vc postou.

porque no log ta falando que o erro foi nessa classe “EstadoResource” do "pacote br.com.website.resource"
e o construtor ta diferente tambem.

o construtor da classe EstadoResource que esta no log recebe “EstadoDaoInterface” enquanto a que vc postou ta esperando “EstadoDao”

GRAVE: The following errors and warnings have been detected with resource and/or provider classes:  
  SEVERE: Missing dependency for constructor public br.com.website.resource.EstadoResource(br.com.website.dao.EstadoDaoInterface) at parameter index 0
darklordkamui

voce por acaso ta usando o CDI para Injeção de Dependencia?

tefo

Eai cara..

eu tinha me equivocado.. agora sim ta certa a classe la emcima, dá uma olhada de novo. bom, vou postar aqui também a classe correta:
package br.com.website.resource;    
        
@Path("/estado")    
@Resource  
public class EstadoResource {    
  
    private final EstadoDaoInterface dao;  
  
    public EstadoResource(EstadoDaoInterface dao) {  
         this.dao = dao;  
    }  
        
    @Get @Path("/list/{idPais}")    
    @Produces(MediaType.APPLICATION_JSON)    
    public String getListaEstados(@PathParam("idPais") Integer idPais) throws Exception {    
        
    ObjectMapper mapper = new ObjectMapper();    
    String response = "";    
        
    response = mapper.writeValueAsString(dao.listar(idPais));    
        
    return response;    
    }    
}
tefo

Olá darklordkamui,

ainda nao lidei com CDI, estou usando a injeção de dependência do vRaptor que é com Spring…

DaniloAndrade

vc anotou a implementação do "EstadoDaoInterface " com @Component?

vc ja tentou tambem mudar seu construtor pra receber a classe concreta da sua interface “EstadoDaoInterface”?

tefo

Eai DaniloAndrade,

cara, está anotado sim, e tanto com a interface quanto com a classe concreta funcionam seguindo o fluxo do vRaptor.
Não sei pq a injeção de dependência funciona quando a aplicação segue o fluxo normal do vRaptor acessando o controller, dao, etc…
só não está funcionando agora pq estou acessando a classe EstadoResource.java diretamente via requisição Ajax, ou seja, não seguindo aquele fluxo normal sem passar por nenhum controller…

particularmente acho que tem que configurar alguma outra coisa em outro lugar para a injeção de dependência funcionar fora do fluxo normal…

DaniloAndrade

como voce ta fazendo a requisição Ajax ?

coloca seu jsp pra gente da uma olhada

tefo

a parte da requisição não tem nada haver.. mas vou postar tudo aqui..
Veja, assim (SEM IMPLEMENTAR A INJEÇÃO DE DEPENDÊNCIA DO DAO) funciona normalmente e sem nenhum erro:

EstadoResource.java:
package br.com.website.resource;

@Path("/estado")
public class EstadoResource {

@Get @Path("/list/{idPais}")
@Produces(MediaType.APPLICATION_JSON)
public String getListaEstados(@PathParam("idPais") Integer idPais) throws Exception {

ObjectMapper mapper = new ObjectMapper();
String response = "";

/* valores de teste */
Long paisId = Long.parseLong(idPais.toString());

Pais pais = new Pais();
pais.setId(paisId);
pais.setNome("Brasil");
pais.setSigla("BR");

Estado estado = new Estado();
estado.setId(1L);
estado.setNome("Alagoas");
estado.setSigla("AL");
estado.setPais(pais);

List<Estado> lsEstado = new ArrayList<Estado>();
lsEstado.add(estado);

response = mapper.writeValueAsString(lsEstado);

return response;
}
}
retorno do método getListaEstados:
[{"id":1,"nome":"Alagoas","sigla":"AL","pais":{"id":1,"nome":"Brasil","sigla":"BR"}}]
requisição ajax:
getJSON = function(url, data, dt, bs, s, e){
$.ajax({
type:"get",
url:url,
data:data,
dataType:dt,
beforeSend:bs,
success:s,
error:e
});
});

getJSON(
'/website/rest/estado/list/1',
null,
"json",
function(xhr, settings){},
function(data, textStatus, xhr){},
function(xhr, textStatus, errorThrown){}
);

ao meu ver, então se sem a injeção de dependência do dao funciona e com a injeção de dependência do dao NÃO funciona..
acredito que seja alguma configuração faltando..

DaniloAndrade

tefo,
tira uma duvida todas anotações que vc ta usado sao do vRaptor?

tefo
Opa, os imports COM a implementação do dao são esses:
import java.io.IOException;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import br.com.caelum.vraptor.Resource;
import br.com.website.dao.EstadoDaoInterface;
DaniloAndrade

Cara pelo o que eu estou entendendo , vc tá tentando usar VRaptor junto com um webservice rest.

eu acho que vc não vai conseguir usar a injeção de dependência do vRaptor ai, acredito que o ideal já que vc esta usando JAX-RS seria usar o EJB/CDI.

mas tenho pouca experiência com JAX-RS.

ou vc pode usar só VRaptor sem usar JAX-RS.

me corrijam se falei alguma besteira :lol:

tefo

acredito que deva existir um jeito pra injeção de dependência do vRaptor funcionar fora do fluxo…
deve ter alguma configuração faltando pra isso, afinal, tudo é configurável…

Lucas_Cavalcanti

tire todas as anotações do JAX-RS e use as respectivas do VRaptor…

vc tá misturando as duas coisas, e isso não funciona.

import javax.ws.rs.GET;

import javax.ws.rs.Path;

import javax.ws.rs.PathParam;

import javax.ws.rs.Produces;

import javax.ws.rs.core.MediaType;

use só o @Get e @Path do vraptor e pra produzir json vc pode usar:

result.use(Results.json()).from(lsEstado).serialize()
DaniloAndrade

pode ser que tenha, mas não sei dizer, acho que quem pode responder essa pergunta é Lucas Cavalcanti, ele entra sempre e responde perguntas sobre o vraptor, edita o titulo e coloca Vraptor junto,

da uma consultada na documentação tambem

desculpa não consegui ajudar mais

DaniloAndrade

é velho se o Lucas falou que não funciona.
então não funciona

tefo

ok Lucas.. estou meio perdido com isso agora..

pelo que eu entendi, vc quis dizer para eu fazer isso:
package br.com.website.resource;    

import static br.com.caelum.vraptor.view.Results.json;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.website.dao.EstadoDaoInterface;
        
@Path("/estado")    
@Resource  
public class EstadoResource {    
  
    private final EstadoDaoInterface dao;  
    private final Result result;
  
    public EstadoResource(EstadoDaoInterface dao, Result result) {  
         this.dao = dao;  
         this.result = result;
    }  
        
    @Get @Path("/list/{idPais}")    
    public void getListaEstados(Integer idPais) {    
        result.use(json()).from(dao.listar(Long.parseLong(idPais.toString()))).serialize();
    }    
}
e a requisição ajax é essa:
getJSON = function(url, data, dt, bs, s, e){  
$.ajax({  
type:"get",  
url:url,  
data:data,  
dataType:dt,  
beforeSend:bs,  
success:s,  
error:e  
});  
});  
  
getJSON(  
'/website/rest/estado/list/1',  
null,  
"json",  
function(xhr, settings){},  
function(data, textStatus, xhr){},  
function(xhr, textStatus, errorThrown){}  
);
só que assim dá timeout ao startar o tomcat..

estou no caminho certo?
o que falta?

Lucas_Cavalcanti

o timeout pode ser por vários motivos… precisa ver o que aparece no log… tenta aumentar o timeout do servidor e esperar… provavelmente é a conf do banco de dados.

tefo

certo, agora com o server startando tentei executar a requisição ajax e obtive o retorno “Status 404 Not Found”

Lucas_Cavalcanti

/website/rest/estado/list/1

não deveria ser:

/website/estado/list/1

?

tefo

tens razao Lucas…
o /rest/* era por causa de uma servlet do Jersey que eu havia configurado antes no web.xml

funcionou aqui!

brigadão! :smiley:

Criado 23 de julho de 2012
Ultima resposta 23 de jul. de 2012
Respostas 22
Participantes 5