Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
20
respostas

[Projeto] Erro ao utilizar Service e DAO sem usar Interface.

Estou trabalhando em um projeto em que devo transformar o InstituicaoserviceImpl em InstituicaoService e o InstituicaoDAOImpl em InstituicaoDAO!

Quando faço essas mudanças aparece o seguinte erro:

Error creating bean with name 'instituicao Controller': Unsatisfied dependency expressed through field 'instituicaoDAO'; nested exception is org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'instituicaoDAO' is expected to be of type 'br.gov.am.sefaz.crf.dao.InstituicaoDAO' but was actually of type 'com.sun.proxy.$Proxy211'

Alguém tem alguma ideia do que possa vir a ser o problema?

20 respostas

Oi!

Consegue mandar aqui o código das suas classes Controller, Service e Dao?

@Controller
@RequestMapping(value = "/gerencia/instituicoes")
public class InstituicaoController {
  
      private static final String INSTITUICAO = "instituicao";
      private static final String REGISTRO_NAO_ENCONTRADO = "O registro pesquisado não foi encontrado.";
      private static final String REGISTRO_CADASTRADO_COM_SUCESSO = "Registro cadastrado com sucesso.";
      private static final String REGISTRO_ALTERADO_COM_SUCESSO = "Registro alterado com sucesso.";
      private static final String REGISTRO_REMOVIDO_COM_SUCESSO = "Registro removido com sucesso.";
      private static final String REDIRECT = "redirect:/gerencia/instituicoes/";
      private static final String DANGER = "danger";
      private static final String SUCCESS = "success";
      private static final String MSG_CLASS = "msgClass";
      private static final String TRANSACAO_ADD = "GER_INSTI_A_ACT";
      private static final String TRANSACAO_EDT = "GER_INSTI_E_ACT";
      private static final String TRANSACAO_DEL = "GER_INSTI_D_ACT";	  
      private static final String ERRO_PERMISSAO_TRANSACAO = "Você não tem acesso a essa transação: ";
      private static final Logger LOGGER = Logger.getLogger(InstituicaoController.class.getName());
  
  @Autowired
  InstituicaoService srvInstituicao;
  
  @Autowired
  InstituicaoDAO instituicaoDAO;
 
  @GetMapping("")
  @ResponseBody
  public ModelAndView index(HttpServletRequest request, HttpServletResponse response, final RedirectAttributes redirectAttributes) throws Exception
  {
    
    ModelAndView model;
    
    try {
      
      List<Instituicao> listaInstituicoes = instituicaoDAO.findAll();
        
      model = new ModelAndView("gerencia/instituicao/index");
      model.addObject("listaInstituicoes", listaInstituicoes);
      
    } catch (Exception e) {
      
      LOGGER.log(Level.INFO, e.toString(), e);
      String msgErro = Utils.getMsgErroException(e);
      Mailer.enviarEmailDeErro(e, request);
      model = Utils.getModelErroGerencia(msgErro, redirectAttributes, request);
      
    }
     
    return model;    
    
  }
@Transactional
@Service(value = "instituicaoService")
public class InstituicaoService extends BaseService<Instituicao, Long> {
  
  private static final String INSTITUICAO = "instituicao";
  
  private InstituicaoDAO instituicaoDAO;
  
  @Autowired
  public InstituicaoService(InstituicaoDAO repositorio) {
    super(repositorio);
    this.instituicaoDAO = repositorio;
  }
  
  @Override
  public List<Instituicao> findInstituicoesAtivas() {
    return this.instituicaoDAO.findInstituicoesAtivas();
  } 
  
  @Override
  public Instituicao cadastrandoInstituicao(@Valid @ModelAttribute(INSTITUICAO) Instituicao instituicao) 
  {
    instituicaoDAO.save(instituicao); 
    return instituicaoDAO.cadastrandoInstituicao(instituicao);
  }
  
  @Override
  public Instituicao alterandoInstituicao(@Valid @ModelAttribute(INSTITUICAO) Instituicao instituicao)
  {  
    
    instituicaoDAO.update(instituicao);
    return instituicaoDAO.alterandoInstituicao(instituicao);

  }
  
  @Override
  public Instituicao removendoInstituicao(@Valid @ModelAttribute(INSTITUICAO) Instituicao instituicao)
  {  
    instituicaoDAO.delete(instituicao);
    return instituicaoDAO.removendoInstituicao(instituicao);

  }
  
}
package br.gov.am.sefaz.crf.dao.implementation;

import java.util.List;

import javax.transaction.Transactional;
import javax.validation.Valid;

import org.springframework.stereotype.Repository;
import org.springframework.web.bind.annotation.ModelAttribute;

import br.gov.am.sefaz.crf.dao.InstituicaoDAO;
import br.gov.am.sefaz.crf.entity.Instituicao;
import br.gov.am.sefaz.infra.dao.HibernateDAO;


@Repository(value = "instituicaoDAO")
@Transactional
public class InstituicaoDao extends HibernateDAO<Instituicao, Long> {
    private static final String INSTITUICAO = "instituicao";
    
    public InstituicaoDao(){
        setClazz(Instituicao.class);    
      }

  @SuppressWarnings("unchecked")
  public List<Instituicao> findInstituicoesAtivas() {
    return getCurrentSession().getNamedQuery("instituicao.findInstituicoesAtivas").list();
  }
  
  public Instituicao cadastrandoInstituicao(@Valid @ModelAttribute(INSTITUICAO) Instituicao instituicao) {
      return instituicao;
  }
  
  public Instituicao alterandoInstituicao(@Valid @ModelAttribute(INSTITUICAO) Instituicao instituicao) {
      return instituicao;
  }
  
  public Instituicao removendoInstituicao(@Valid @ModelAttribute(INSTITUICAO) Instituicao instituicao) {
      return instituicao;
  }
}

Manda também o código dessa sua classe HibernateDAO

package br.gov.am.sefaz.infra.dao;

import java.io.Serializable;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Example;
import org.hibernate.criterion.MatchMode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

@SuppressWarnings("unchecked")
@Transactional
public abstract class HibernateDAO<T extends Serializable, ID extends Serializable> implements IDAO<T, ID> {

    private Class<T> clazz;
    @Autowired
    private SessionFactory sessionFactory;

    public void setClazz(final Class<T> clazzToSet) {
        clazz = clazzToSet;
    }

    @Override
    public T findOne(ID id) {
        return (T) getCurrentSession().get(clazz, id);
    }

    @Override
    public List<T> findAll() {
        return getCurrentSession().createQuery("from " + clazz.getName()).list();
    }

    @Override
    public ID save(final T entity) {
        return (ID) getCurrentSession().save(entity);
    }

    @Override
    public T saveOrUpdate(final T entity) {
        getCurrentSession().saveOrUpdate(entity);
        return entity;
    }

    @Override
    public T update(final T entity) {
        return (T) getCurrentSession().merge(entity);
    }

    @Override
    public void delete(final T entity) {
        getCurrentSession().delete(entity);
    }

    @Override
    public void deleteById(ID id) {
        final T entity = findOne(id);
        delete(entity);
    }

    @Override
    /*
     * protected T GetByExample(T example) { var c =
     * DetachedCriteria.For<T>().Add(Example.Create(example).ExcludeNone()); var
     * props = typeof (T).GetProperties() .Where(p =>
     * p.PropertyType.GetInterfaces().Contains(typeof(IEntityBase))); foreach
     * (var pInfo in props) { c.Add(Restrictions.Eq(pInfo.Name,
     * pInfo.GetValue(example))); } return Query(c); }
     */
    public List<T> find(T entity) {
        Example entityExample = Example.create(entity).ignoreCase();
        Criteria criteria = getCurrentSession().createCriteria(entity.getClass()).add(entityExample);
        return criteria.list();
    }

    public List<T> find(T entity, MatchMode matchMode, boolean ignoreCase) {
        org.hibernate.criterion.Example example = org.hibernate.criterion.Example.create(entity);

        if (matchMode != null) {
            example = example.enableLike(matchMode);
        }

        if (ignoreCase) {
            example = example.ignoreCase();
        }

        return getCurrentSession().createCriteria(entity.getClass()).add(example).list();
    }

    protected final Session getCurrentSession() {
        return sessionFactory.getCurrentSession();
    }
}

Por fim mande a interface IDAO :D

package br.gov.am.sefaz.infra.dao;

import java.io.Serializable;
import java.util.List;
import org.hibernate.criterion.MatchMode;

public interface IDAO<T extends Serializable, ID extends Serializable> {

    void delete(final T entity);
    void deleteById(ID id);
    List<T> findAll();
    T findOne(ID id);
    ID save(final T entity);
    T saveOrUpdate(final T entity);
    T update(final T entity);
    List<T> find(T entity);
    
    public List<T> find(T entity, MatchMode matchMode, boolean ignoreCase);
}

Tem várias possibilidades de acontecer esse problema. Uma delas é quando você injeta a implementação, ao invés da interface, que é justamente o que está acontecendo no seu projeto.

Na sua classe controller tem esse atributo:

@Autowired
InstituicaoDAO instituicaoDAO;

Mas o correto agora é declarar o tipo pela interface:

@Autowired
IDAO<Instituicao, Long> instituicaoDAO;

Provavelmente o erro vai mudar para uma exception indicando ambiguidade, pois no projeto tem múltiplas classes que implementam a interface IDAO, e com isso o Spring não saberá qual delas injetar no atributo. Para corrigir, será necessário utilizar a anotação @Qualifier:

@Autowired
@Qualifier("instituicaoDAO")
IDAO<Instituicao, Long> instituicaoDAO;

Veja se com isso resolve.

@Qualifier("instituicaoDAO") não está sendo reconhecida mesmo importando!!

Qual a versão do spring no seu projeto? manda aqui o pom.xml

4.0.0 br.gov.am.sefaz crf war 2.30.5 Sistema do Conselho de Recursos Fiscais http://sistemas.sefaz.am.gov.br/crf

<properties>
    <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
    <java-version>1.8</java-version>
    <project-encoding>UTF-8</project-encoding> 
    <project.build.sourceEncoding>${project-encoding}</project.build.sourceEncoding>
    <project.reporting.outputEncoding>${project-encoding}</project.reporting.outputEncoding>
</properties>

<dependencies>
 
    <!-- Zero 3.7.8 -->
    <dependency>
        <groupId>br.gov.am.sefaz</groupId>
        <artifactId>zero</artifactId>
        <version>3.7.16</version>
        <exclusions>
            <exclusion>
                <groupId>jasperreports</groupId>
                <artifactId>jasperreports</artifactId>
            </exclusion>
            <exclusion>
                <groupId>javassist</groupId>
                <artifactId>javassist</artifactId>
            </exclusion>
            <exclusion>
                <artifactId>nfe-fcd</artifactId>
                <groupId>br.gov.am.sefaz</groupId>
            </exclusion>
            <exclusion>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-api</artifactId>
            </exclusion>
        </exclusions>
    </dependency>	
    
    <!-- Bibliotecas comuns -->
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-web-api</artifactId>
        <version>7.0</version>
        <scope>provided</scope>
    </dependency>
        
    <!-- Test -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>4.3.6.RELEASE</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.hsqldb</groupId>
        <artifactId>hsqldb</artifactId>
        <version>2.2.8</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>c3p0</groupId>
        <artifactId>c3p0</artifactId>
        <version>0.9.1.2</version>
        <scope>test</scope>
    </dependency>


    <!-- Driver Oracle -->
    <dependency>
        <groupId>oracle</groupId>
        <artifactId>ojdbc8</artifactId>
        <version>ojdbc8</version>
    </dependency>


    <!-- Spring Security -->
     <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-taglibs</artifactId>
        <version>4.2.1.RELEASE</version>
    </dependency>		
        
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <scope>provided</scope>
    </dependency>

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>		
    
    <!-- JSPTags -->
    <dependency>
        <groupId>br.gov.am.sefaz</groupId>
        <artifactId>jsptags</artifactId>
        <version>0.0.12</version>
    </dependency>	
    
    <!-- iText 5.5 -->
     <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itextpdf</artifactId>
        <version>5.5.6</version>
    </dependency>
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itext-xtra</artifactId>
        <version>5.4.5</version>
    </dependency>		
    <dependency>
        <groupId>com.itextpdf.tool</groupId>
        <artifactId>xmlworker</artifactId>
        <version>5.5.6</version>
    </dependency>
     
    <!-- Jackson JSON Mapper -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.5.2</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.5.2</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.9.13</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-hibernate4</artifactId>
        <version>2.5.2</version>
    </dependency>
    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.3.1</version>
    </dependency>		

    <!-- GSON -->		
    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.8.5</version>
    </dependency>

Mandando em partes

    <!-- Diversos -->
    <dependency>
        <groupId>commons-codec</groupId>
        <artifactId>commons-codec</artifactId>
        <version>1.9</version>
    </dependency>
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.5</version>
    </dependency>
    <dependency>
        <groupId>org.apache.velocity</groupId>
        <artifactId>velocity</artifactId>
        <version>1.7</version>
    </dependency>
    <dependency>
        <groupId>org.jsoup</groupId>
        <artifactId>jsoup</artifactId>
        <version>1.12.1</version>
    </dependency>
    
    <!-- Lucene -->
    <dependency>
        <groupId>org.apache.lucene</groupId>
        <artifactId>lucene-core</artifactId>
        <version>8.2.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.lucene</groupId>
        <artifactId>lucene-analyzers-common</artifactId>
        <version>8.2.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.lucene</groupId>
        <artifactId>lucene-queryparser</artifactId>
        <version>8.2.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.lucene</groupId>
        <artifactId>lucene-highlighter</artifactId>
        <version>8.2.0</version>
    </dependency>
    
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.32</version>
        <scope>provided</scope>
    </dependency>
    
    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.1</version>
    </dependency>
</dependencies>

<build>
    <finalName>crf</finalName>
    <defaultGoal>package</defaultGoal>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>false</filtering>
        </resource>
        <resource>
            <directory>src/main/resources/properties</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.3.2</version>
            <configuration>
                <source>${java-version}</source>
                <target>${java-version}</target>
                <encoding>${project-encoding}</encoding>
                <compilerArguments>
                    <endorseddirs>${endorsed.dir}</endorseddirs>
                </compilerArguments>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <version>2.2</version>
            <configuration>
                <path>/${project.build.finalName}</path>
                <port>8081</port>
                <!-- 
                    <httpsPort>8443</httpsPort>
                    <keystoreType>JKS</keystoreType>
                    <keystoreFile>conf/localhost.jks</keystoreFile>
                    <keystorePass>localhost</keystorePass>
                    <truststoreType>JKS</truststoreType>
                    <truststoreFile>conf/localhost.jks</truststoreFile>
                    <truststorePass>localhost</truststorePass>
                    <clientAuth>want</clientAuth>	
                -->
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>3.3.1</version>
            <configuration>
                <webXml>src/main/webapp/WEB-INF/web.xml</webXml>
            </configuration>
        </plugin>
    </plugins>
</build>

<organization>
    <name>SEFAZ/AM</name>
    <url>http://www.sefaz.am.gov.br</url>
</organization>

<repositories>
    <repository>
        <id>itext</id>
        <name>iText Repository - releases</name>
        <url>https://repo.itextsupport.com/releases</url>
    </repository>
</repositories>

Está ok. Tem a dependência do spring security, que inclui as outras dependência dele.

Deu erro para importar? Manda um print aqui do problema para eu entender melhor.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Mesmo colocando o @Qualifier deu o mesmo erro!!!

solução!

Pelo código, acredito que seu projeto seja "antigo" e deve estar configurando o Spring via XML, certo?

Procure no projeto o arquivo xml de configurações do Spring (normalmente com nome applicationContext.xml) e encontre nele essa tag:

<tx:annotation-driven />

Adicione nela esse atributo:

<tx:annotation-driven proxy-target-class="true" />

Veja se resolve.

No projeto há um applicationContext-test.xml, mas não applicationContext.xml! Tentei substituir no applicationContext-test.xml o <tx:annotation-driven proxy-target-class="true" /> e continuo acusando o meu erro.

Esse daí é apenas usado nos testes automatizados. Talvez o arquivo tenha outro nome.

Dá uma olhada no projeto se tem outro xml com as configurações do Spring. Geralmente ele fica em uma dessas pastas:

  • src/main/resources
  • src/main/webapp/WEB-INF
  • webContent/WEB-INF

Funcionouu!!! O arquivo que alterei foi o spring-hibernate.xml colocando o <tx:annotation-driven proxy-target-class="true" /> como vocÊ sugeriu!!

Muiiito Obrigado Rodrigo!!