Solucionado (ver solução)
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!!