Spring não injeta service em Servlet

8 respostas
Tiburcio_Mancha

Entrarei em um projeto onde preciso usar Spring 3 com Servlet e JDBC, e estou desenvolvendo uma aplicação para estudo. Ao carregar o Servlet, o Spring não injeta o service, dando nullPointer. Vou postar os arquivos e se alguem puder ajudar agradeço!

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
	xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
	<display-name>TestServlet</display-name>
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	 <listener> 
        <listener-class> 
            org.springframework.web.context.request.RequestContextListener 
        </listener-class> 
    </listener> 
	<servlet>
		<servlet-name>artistaServlet</servlet-name>
		<servlet-class>br.com.estudo.servlets.ArtistaServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>artistaServlet</servlet-name>
		<url-pattern>/artistaServlet</url-pattern>
	</servlet-mapping>	
</web-app>
applicationContext
<?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:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

	<context:component-scan base-package="br.com.estudo" />
	<context:annotation-config />

	<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost/campeonato" />
        <property name="username" value="root" />
        <property name="password" value="1234" />
    </bean>
 
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource" />
    </bean>
	
	<tx:annotation-driven/>
</beans>
servlet
package br.com.estudo.servlets;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Controller;

import br.com.estudo.beans.Artista;
import br.com.estudo.service.ArtistaService;

/**
 * @author Shasqua
 * 
 */
@Controller("artistaServlet")
public class ArtistaServlet extends HttpServlet {
	
	@Autowired
	private ArtistaService artistaService;

	private Artista artista = new Artista();
	/**
	 * 
	 */
	private static final long serialVersionUID = -696273495882464291L;

	public void service(HttpServletRequest request,
			HttpServletResponse response) {

		RequestDispatcher rd = null;

		try {
			artistaService.insert(artista);
			rd = request.getRequestDispatcher("/sucesso.jsp");

		} catch (Exception e) {
			e.printStackTrace();
			rd = request.getRequestDispatcher("/failure.jsp");
		}

		try {
			rd.forward(request, response);
		} catch (ServletException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public ArtistaService getArtistaService() {
		return artistaService;
	}

	public void setArtistaService(ArtistaService artistaService) {
		this.artistaService = artistaService;
	}
	
	

}
service
package br.com.estudo.service.impl;

import java.io.Serializable;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import br.com.estudo.beans.Artista;
import br.com.estudo.dao.ArtistaDao;
import br.com.estudo.service.ArtistaService;

@Service("artistaService")
public class ArtistaServiceImpl implements ArtistaService,Serializable
{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	@Autowired
	private ArtistaDao artistaDao;
	
	public void insert(Artista artista){
		artistaDao.insert(artista);
	}
	
	public void update(Artista artista){
		artistaDao.updtae(artista);
	}
	
	public void delete(Artista artista){
		artistaDao.delete(artista);
	}
	
	public Artista findArtista(Artista artista){
		return artistaDao.findArtista(artista);
	}
}
dao
package br.com.estudo.dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

import br.com.estudo.beans.Artista;
import br.com.estudo.dao.ArtistaDao;

/**
 * @author Shasqua
 *
 */
@Repository
public class ArtistaDaoImpl implements ArtistaDao {
	
	@Autowired
	private JdbcTemplate jdbcTemplate;

	@Override
	public void delete(Artista artista) {
		String sql = "DELETE FROM Artista WHERE idArtista = ?";
		jdbcTemplate.update(sql, new Object[] { artista.getIdArtista()});
	}

	@SuppressWarnings("unchecked")
	@Override
	public Artista findArtista(Artista artista) {
		 String sql = "SELECT * FROM Artista WHERE idArtista = ?";
		 
	        List resultados = jdbcTemplate.query(sql, new Object[]{artista.getIdArtista()},
	                new RowMapper() {
	 
	                    public Object mapRow(ResultSet rs, int i) throws SQLException {
	                        Artista art = new Artista();
	                        art.setIdArtista(rs.getInt("idArtista"));
	                        art.setNome(rs.getString("nome"));
	                        art.setGenero(rs.getString("genero"));
	                        art.setNacionalidade(rs.getString("nacionalidade"));
	                        
	                        return art;
	                    }
	                });
	 
	        Artista art = new Artista();
	        if (resultados.size() > 0) {
	            art = (Artista) resultados.get(0);
	        } else {
	            art.setIdArtista(artista.getIdArtista());
	        }
		return art;
	}

	@Override
	public void insert(Artista artista) {
		String sql = "INSERT INTO Artista(nome,genero,nacionalidade) VALUES(?,?,?)";
		jdbcTemplate.update(sql, new Object[] { artista.getNome(),
				artista.getGenero(), artista.getNacionalidade() });

	}

	@Override
	public void updtae(Artista artista) {
		String sql = "UPDATE Artista SET nome = ?, genero= ?, nacionalidade= ? WHERE idArtista = ?";
        jdbcTemplate.update(sql, new Object[]{artista.getNome(), artista.getGenero(), artista.getNacionalidade(),artista.getIdArtista()});

	}

}

8 Respostas

R

Olá.
No servlet,troca @Autowired por @Resource.

Tiburcio_Mancha

Amigo, obrigado pela ajuda…

ao trocar a annotation, peguei o seguinte erro agora:

javax.naming.NameNotFoundException: Name br.com.estudo.servlets.ArtistaServlet is not bound in this Context at org.apache.naming.NamingContext.lookup(NamingContext.java:770) at org.apache.naming.NamingContext.lookup(NamingContext.java:153) at org.apache.catalina.util.DefaultAnnotationProcessor.lookupFieldResource(DefaultAnnotationProcessor.java:278) at org.apache.catalina.util.DefaultAnnotationProcessor.processAnnotations(DefaultAnnotationProcessor.java:187) at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1120) at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:809) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:129) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) at java.lang.Thread.run(Unknown Source)

feltraco

Alguns dias depois… rs rs

Estou com o mesmo problema.
por acaso vc chegou a uma solucao ?

Grato

MauNunes

Alguem consegui descobrir como injetar uma service em um servlet?
O erro que dá é porque o @Resource que está sendo utilizando não é o correto e pertence a classe javax.annotations

feltraco

Na verdade dah erro pq o Servlet nao carrega o contexto do spring.

Consegui resolver utilizando @Autowired na declaracao da service e no metodo doGet ou doPost, vc tem que adicionar esta linha:

SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this, config.getServletContext());

Aqui pra mim isso resolveu.

Tentai.

EDIT: Correcao, voce tem que adicionar no metodo INIT do servlet e nao do doGet.

G

Alguns minutos depois…

feltraco, estou com o mesmo problema e vi que você conseguiu resolver.
Só uma pergunta, esse config ( config.getServletContext() ) vem de onde?

Obrigado

feltraco

@gregoryfontenele
Esse config eh oq vem por parametro no INIT do servlet, vem assim: ServletConfig config

J

Estou iniciando meus estudos com Spring e fazendo um exemplo, me deparei com o mesmo problema (nullpoint) , mas estou utilizando managed Bean e não estou usando annotations.

Alguma dica?

Criado 9 de janeiro de 2011
Ultima resposta 13 de jan. de 2012
Respostas 8
Participantes 6