Boa tarde, estou tentando configurar o spring para uma aplicação web e necessito que o spring faça a injeção das classes para mim. Coloquei alguns logs na inicialização do servidor e percebi que as dependencias são injetadas mas quando tento usa-las em um servlet o objeto esta nulo.
Criei um objeto ApplicationContext dentro do servlet e utilizei o .getBean() para recuperar a injeção e deu certo.
Minha duvida é se vou ter que fazer isto em todos os servlets ou existe alguma forma automatica para este processo?
A princípio, não deveria ser assim.
alguma coisa está errada
certo, aqui estão os codigos:
web.xml
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.*</url-pattern>
</servlet-mapping>
dispatcher-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="usuarioDAO" class="mercado.dao.UsuarioDAO" />
<bean id="usuarioService" class="mercado.service.UsuarioService" />
<bean id="loginServlet" class="mercado.servlet.LoginServlet">
<property name="usuarioService" ref="usuarioService" />
</bean>
</beans>
LoginServlet.java
private IUsuarioService usuarioService;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {
String login = req.getParameter("login");
String senha = req.getParameter("senha");
System.out.println("-------------------------- usuario service - "+usuarioService);
Usuario usuario = usuarioService.getUsuarioPorLoginSenha(login, senha);
if(usuario != null){
req.getSession(true).setAttribute("usuario_logado", usuario);
resp.sendRedirect(req.getContextPath()+"/app/home.jsp");
}else{
resp.sendRedirect(req.getContextPath());
}
}
public void setUsuarioService(IUsuarioService usuarioService){
System.out.println("-------------------------- set usuario service");
this.usuarioService = usuarioService;
System.out.println("-------------------------- spring - "+usuarioService);
System.out.println("-------------------------- local - "+this.usuarioService);
}
public IUsuarioService getUsuarioService(){return this.usuarioService;}
Na inicialização do servidor a dependencia é injetada, porem no metodo doGet quando quero utilizar a classe usuarioService a variavel esta nula.
Boa tarde
Na minha aplicação para realizar injeção das dependências entre o Spring e o Servlet, fiz da seguinte maneira:
Inicializei o contexto através do Listener do Spring:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
Dentro das minhas Servlets adicionei o seguinte código no método init:
public void init(){
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
}
Este método do Spring, injeta as dependências na instância do Servlet.
Falou.