Solucionado (ver solução)
Solucionado
(ver solução)
18
respostas

Formulario para cadastrar usuarios

Opa

Estou tentando fazer um formulário para inserir um usuário no sistema e esta acontecendo os seguintes erros:

criei o método para inserir o usuario como foi feito no livro.

public void inserir(Usuario usuario) { em.persist(usuario); } quando tento fazer o insert, acontece o seguinte erro:

GRAVE: Servlet.service() for servlet [dispatcher] in context with path [/KMControl] threw exception [Request processing failed; nested exception is javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'persist' call] with root cause javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'persist' call at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:277) at com.sun.proxy.$Proxy37.persist(Unknown Source) at br.com.kmcontrol.dao.UsuariosDao.inserir(UsuariosDao.java:35) at br.com.kmcontrol.controller.UsuarioController.gravarUsuario(UsuarioController.java:36) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:222) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:814) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:737) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:969) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:871) at javax.servlet.http.HttpServlet.service(HttpServlet.java:650) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:845) at javax.servlet.http.HttpServlet.service(HttpServlet.java:731) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:121) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:316) at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:114) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:122) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:169) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:48) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:205) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:120) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) at org.springframework.security.web.csrf.CsrfFilter.doFilterInternal(CsrfFilter.java:120) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:64) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:91) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:53) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:213) at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:176) at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Unknown Source)

Se eu colocar @Transactional em cima da classe ou do método inserir passa a dar o seguinte erro:

GRAVE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'securityConfiguration': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private br.com.kmcontrol.dao.UsuariosDao br.com.kmcontrol.conf.SecurityConfiguration.usuarioDao; nested exception is java.lang.IllegalArgumentException: Can not set br.com.kmcontrol.dao.UsuariosDao field br.com.kmcontrol.conf.SecurityConfiguration.usuarioDao to com.sun.proxy.$Proxy40 at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538) at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:446) at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:328) at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107) at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:5001) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5517) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652) at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:677) at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1942) at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) at java.util.concurrent.FutureTask.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private br.com.kmcontrol.dao.UsuariosDao br.com.kmcontrol.conf.SecurityConfiguration.usuarioDao; nested exception is java.lang.IllegalArgumentException: Can not set br.com.kmcontrol.dao.UsuariosDao field br.com.kmcontrol.conf.SecurityConfiguration.usuarioDao to com.sun.proxy.$Proxy40 at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:573) at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331) ... 26 more

o que posso fazer nesse caso?

18 respostas

Oi Filipe,

Como você está controlando a transação da JPA?

Aparentemente o problema é que a transação não está aberta. Como ficou sua configuração de transação?

Abraço

Olá Paulo,

Sim, o primeiro erro fala que a transação não esta aberta. Mas quando coloco transação aparece o 2º erro (tem descrito os 2 erros ai).. A transação esta sendo configurada com o @transaction nos outros DAO..

Abraço

Verdade.. não tinha visto Filipe.

Coloca sua configuração do SpringSecurity, tem algo ligado a ela, e o Dao também por favor.

Se precisar trocar alguma informação confidencial do seu sistema, só trocar antes de postar o código.

Abraço

está igual os dos vídeos praticamente.. Sei que estou permitindo acesso a quase tudo ai mas é pq são só testes por enquanto...

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;

import br.com.kmcontrol.dao.UsuarioDao;

@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Autowired
    private UsuarioDao usuarioDao;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/usuario/**").permitAll()
            .antMatchers("/").permitAll()
            .antMatchers("/resources/**").permitAll()
            .anyRequest().authenticated()
            .and().formLogin().loginPage("/login").permitAll()
            .and().logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout"));
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(usuarioDao)
            .passwordEncoder(new BCryptPasswordEncoder());
    }

}
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import br.com.kmcontrol.entity.Usuario;

@Repository
@Transactional
public class UsuarioDao {

    @PersistenceContext
    EntityManager em;

    public UserDetails loadUserByUsername(String username) {
        List<Usuario> usuarios = em.createQuery("select u from Usuario u where u.username = :username", Usuario.class)
                                    .setParameter("username", username)
                                    .getResultList();
        if (usuarios.isEmpty()) {
            throw new UsernameNotFoundException("Usuário não encontrado");
        }

        return usuarios.get(0);
    }

    public void inserir(Usuario usuario) {
        em.persist(usuario);
    }

}

Não tem nada de mais nas classes, então não precisei mudar nada.. Só fazendo testes seguindo os vídeos mesmo por enquanto.. Tentando acrescentar algumas coisas..

O @Transactional ai está em cima da classe, mas se eu colocar só no método inserir, acontece o mesmo erro descrito anteriormente.

Uma obs é que tive que atualizar as dependências do spring para funcionar corretamente pois tive outro problema relacionado a segurança (tem outro topico meu ai sobre isso). O Spring está na versão 4.2.4.RELEASE e o Spring Security está na versão 4.0.3.RELEASE.

Desculpe, mandei a classe DAO errada acima. como não tem com editar, vai aqui a correta. Estava fazendo alguns testes e tirei o implements que deveria estar ai.. esqueci de voltar antes de copiar

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Repository;

import br.com.kmcontrol.entity.Usuario;

@Repository
public class UsuarioDao implements UserDetailsService {

    @PersistenceContext
    EntityManager em;

    @Override
    public UserDetails loadUserByUsername(String username) {
        List<Usuario> usuarios = em.createQuery("select u from Usuario u where u.username = :username", Usuario.class)
                                    .setParameter("username", username)
                                    .getResultList();
        if (usuarios.isEmpty()) {
            throw new UsernameNotFoundException("Usuário não encontrado");
        }

        return usuarios.get(0);
    }
    public void inserir(Usuario usuario) {
        em.persist(usuario);
    }

}

esta é a correta.. só muda o implements mesmo que não estava na outra.

Fillipe, você adicionou o pacote de DAO no scanPackages do SpringConfiguration?

@ComponentScan(basePackageClasses = { HomeController.class, UsuarioDao.class, //demais classes
})

Abraço

Sim, está configurado. Não a UsuarioDao diretamente mas outro DAO que esta no mesmo pacote.

@EnableWebMvc
@ComponentScan(basePackageClasses = { IndexController.class, AtendimentosDao.class, FileSaver.class, })
@EnableCaching
public class AppWebConfiguration extends WebMvcConfigurerAdapter {
...
}

Lembrando que tirando esse erro está tudo funcionando corretamente. O cadastro dos produtos, envio de arquivos, os bloqueios das paginas e logar com um usuário inserido direto no banco de dados como no vídeo.

Se eu tirar o @Transactional da classe, o sistema volta a carregar sem erro, só não consigo usar o metodo inserir pois não tem transação ativa(primeiro erro). Se colocar o @Transactional no DAO o @Autowired na SecurityConfiguration para de funcionar e o sistema nem carrega (segundo erro).

Abraço

Fillipe, realmente parece que as configurações estão todas certas.

Mas vamos continuar tentando algumas coisas. Por exemplo, tente mudar o @Transactional para o Controller e vamos como ele se comporta.

Se não funcionar, coloca aqui sua configuração do JPAConfiguration para ver se está tudo certo.

Tambem estou com o mesmo problema.

Fellipe na sua Classe 'SecurityConfiguration' esta com a anotação @EnableWebSecurity

E conforme na aula é para utilizar a @EnableWebMvcSecurity, poderia trocar para ver se resolve o seu problema.

O meu erro Paulo Jr esta apresentando a seguinte mensagem:

Error creating bean with name 'securityConfiguration': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private nome.do.pacote.loja.daos.UsuarioDAO nome.do.pacote.loja.conf.SecurityConfiguration.UsuarioDAO; nested exception is java.lang.IllegalArgumentException: Can not set nome.do.pacote.loja.daos.UsuarioDAO field nome.do.pacote.loja.conf.SecurityConfiguration.UsuarioDAO to com.sun.proxy.$Proxy35

Could not autowire field: private br.com.blendo.loja.daos.UsuarioDAO br.com.blendo.loja.conf.SecurityConfiguration.UsuarioDAO; nested exception is java.lang.IllegalArgumentException: Can not set nome.do.pacote.loja.daos.UsuarioDAO field nome.do.pacote.loja.conf.SecurityConfiguration.UsuarioDAO to com.sun.proxy.$Proxy35

Mahtheus,

o meu está anotado com @EnableWebSecurity pois na versão final do spring security (na aula é usada uma milestone) o @EnableWebMvcSecurity consta como defasado. Mas acho que cheguei a testar... Acho que também tive este problema seu, mas resolvi atualizado as dependências meu pom.xml está da seguinte forma:

<dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.2.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-servlet-api</artifactId>
            <version>8.0.30</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.2</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp.jstl</groupId>
            <artifactId>jstl-api</artifactId>
            <version>1.2</version>
            <exclusions>
                <exclusion>
                    <groupId>javax.servlet</groupId>
                    <artifactId>servlet-api</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.glassfish.web</groupId>
            <artifactId>jstl-impl</artifactId>
            <version>1.2</version>
            <exclusions>
                <exclusion>
                    <groupId>javax.servlet</groupId>
                    <artifactId>servlet-api</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.13</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
            <version>1.7.13</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.13</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.0.6.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.0.6.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate.javax.persistence</groupId>
            <artifactId>hibernate-jpa-2.1-api</artifactId>
            <version>1.0.0.Final</version>
        </dependency>
        <dependency>
            <groupId>javax.transaction</groupId>
            <artifactId>jta</artifactId>
            <version>1.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>4.2.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.38</version>
        </dependency>

        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>1.1.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>5.2.2.Final</version>
        </dependency>

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>18.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>4.1.0.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-config</artifactId>
            <version>4.0.3.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-taglibs</artifactId>
            <version>4.0.3.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-web</artifactId>
            <version>4.0.3.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-core</artifactId>
            <version>4.0.3.RELEASE</version>
        </dependency>
    </dependencies>

referente as aulas, ai só não tem as dependências da aula que converte as paginas para JSON.

Abraço

Obrigado Fellipe pela ajuda, entendi o que você falou mas realmente o problema ainda continua mesmo atualizando as dependências!

Depois que implementei o metodo configure(AuthenticationManagerBuilder auth), que esse error começou apresentar, pensei que fosse as dependências que estavam defasada atualizei mas continua o problema!

Oi Matheus, poderia abrir uma nova dúvida para vermos seu problema separadamente? Pode colocar o link aqui que eu vejo depois.

Fillipe, poderia colocar seu código no github para eu dar uma olhada? Está bem estranho esse erro. Preciso fazer uns testes para ver o que houve.

Abraço

Paulo,

coloquei o projeto no git.. https://github.com/LipeDuoli/KMControl-Spring

o controller do usuário está meio zuado ainda pois foi feito só para testar por enquanto, mas está funcional.. para acessar o formulário de cadastro do usuário tem que ser na mão ainda /usuario/cadastro

vlw! Abraço

Oi Fillipe,

Rodando seu código aqui, rodou tudo certinho. E inseriu o usuário no banco quando coloquei @Transactional em cima da classe de UsuarioController.

Estou usando MySQL também. Outra coisa que mudei foi apenas o create-drop do Hibernate para update mesmo, pois ele recriar o banco não é muito legal para desenvolver. Mas creio que isso não teve nenhum impacto.

Não entendo porque o seu código não funciona.

Oi Paulo,

O @Transactional pode ser colocado na classe UsuarioController normalmente? Eu estava colocando no UsuarioDao (pensei que TINHA que ser no DAO). O @Transactional dos atendimento está no AtendimentoDao e funciona normalmente. Tanto faz o lugar que coloca ou tem um que seria o certo?

O Create-drop foi pra testes.. normalmente fica no update mesmo.. está até comentado lá..

solução!

Não diria que tanto faz. Na verdade, você está definindo o quanto sua transação está abrangendo.

Colocando ela no DAO, você quer dizer que cada método do DAO possui uma transação e meio que roda independente de qualquer outra chamada. Por exemplo, se no controller você chamar dois métodos, os dois rodam independentes. Vamos imaginar que temos dois DAO's injetados em um controller, como o exemplo mero ilustrativo abaixo:

public class CarrinhoController {
  private CarrinhoDao carrinhoDao;
  private ItemDao itemDao;
  public String salvaItensNoBanco(Carrinho carrinho, List<Item> itens) {
    carrinhoDao.salvar(carrinho);
    for (Item item : itens) {
      itemDao.salvar(item);
    }
    return "carrinho/lista";
  }
}

Perceba que para cada carrinho, incluímos uma lista de itens. Se você deixar a transação no DAO, tanto o carrinho como cada item será incluído individualmente. Ai vem a pergunta: E se algum item falhar, o que vai acontecer com os que já haviam sido salvos?

O ponto é: Você não quer dados inconsistentes no seu banco, e para isso, a transação englobando uma parte maior da aplicação resolveria. Se você colocar o @Transaction no Controller, ele terá apenas uma transação para o método salvaItensNoBanco e assim, se falhar 1 item, ele faz rollback de tudo, não permitindo dados inconsistentes no banco.

Usar no DAO não seria errado, mas precisaria de mais cuidado com as questões citadas acima. Se colocando no Controller funcionar, melhor usar no controller mesmo.

Outra coisa, é que consegui replicar seu problema aqui, e realmente o problema é com a injeção do UsuarioDao no SecurityConfiguration. Porém, se você mudar para:

@Autowired
private UserDetailsService userDetailsService;

Irá funcionar. O problema é que irá quebrar ao executar, dizendo que não achou um bean qualificado para o UsuarioController. Isso acontece porque o Spring agora usará a interface que é UserDetailsService para injetar e não mais a implementação. Aí injetar UserDetailsService no Controller ao invés do UsuarioDao. E como ele faz proxy desse Dao, você não conseguirá fazer cast para UsuarioDao.

Para evitar todos esses problemas, melhor deixar a transação no controller.

Excelente explicação Paulo. Entendi perfeitamente como funciona.

Já fiz o teste aqui colocando o @Transaction no controller e já está rodando normalmente.

Muito obrigado pela ajuda e pela paciência para ajudar a esclarecer as coisas..

Abraço

estava com o mesmo problema dos colegas! consegui resolver graças as dicas do @paulo!! parabéns!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software