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

Não consigo registrar o usuário Ana

O projeto sobe pro navegador, mas quando registro a Ana ele dá erro Status 500, conforme print abaixo:

https://docs.google.com/document/d/1Hl8j05jENZHI3kZSL_YGzGv64gNMp4J8I1lI3S3CtRM/edit?usp=sharing

15 respostas
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`owasp`.`usuario_role`, CONSTRAINT `FKld5ci4gxlmsruckp707fmygiq` FOREIGN KEY (`roles_name`) REFERENCES `role` (`name`))

Este erro ocorre porque você está tentando fazer um add/update a uma linha para owasp.usuario_role que não tem um valor válido para o campo roles_name baseado nos valores guardados nesse momento na tabela role para o campo name.

Otávio, Boa noite!

Obrigado pelo retorno!

Vc poderia passar um passo a.passo com a solução do problema.?

Obrigado

Opa roberto, você poderia mandar o trecho de código que você está usando para inserir o usuário Ana?

Otávio, bom dia, td joia?

Conforme solicitado, segue o link com o código da tabela usuario atualizada. https://docs.google.com/document/d/1R_rDlsn10ah6iW13rVbGsFn1hE1c0VbS4kCyWE2JbzM/edit?usp=sharing

Gostaria de destacar que o erro começou a ocorrer após eu seguir as orientações dele na aula sobre " fazer a alteração da senha para o código Hash , segue os códigos da tabela UsuarioDaoImpl https://docs.google.com/document/d/1I0SZRrHzKhF9fIBemkwjUrdlX-dmwhEXYZvsf9OUeoU/edit?usp=sharing.

Ainda, cabe ressaltar que conforme verifiquei quando registro a Ana no site da Alura-shows, embora a página apresente o erro 500, o registro é realizado normalmente - vi isso pois ao entrar na página do perfil, após registrar ela aparecem os dados dela normalmente. Isso sugere que esteja havendo um problema no redirecionamento.

Aguardo seu retorno com as orientações e permaneço à disposição para sanar quisquer dúvidas.

at

Confirma na sua classe UsuarioController se no método registrar você está informando "ROLE_USER" para a role do usuário sendo cadastrado. Exemplo:

    @RequestMapping(value = "/registrar", method = RequestMethod.POST)
    public String registrar(MultipartFile imagem,
            @ModelAttribute("usuarioRegistro") Usuario usuarioRegistro,
            RedirectAttributes redirect, HttpServletRequest request,
            Model model, HttpSession session) throws IllegalStateException, IOException {

        tratarImagem(imagem, usuarioRegistro, request);
        usuarioRegistro.getRoles().add(new Role("ROLE_USER"));

        dao.salva(usuarioRegistro);
        session.setAttribute("usuario", usuarioRegistro);
        model.addAttribute("usuario", usuarioRegistro);
        return "usuarioLogado";
    }

Veja se na tabela usuario_role no seu MySQL tem o registro ROLE_USER também

Provavelmente esse relacionamento entre usuário e usuario_role que está errado

Otávio, boa tarde!

Na hora que eu tento tanto registrar o usuario quanto logr com um já existente, ele dá mensagem de erro (500) estou enviando os códdigos do UsuarioController, o print do MYSQL e a página do erro que aparece no Tomcat quando registro o usuario.

obrigado pelo auxílio!

Seguem os links de referencia: UsuarioController https://docs.google.com/document/d/1H4ZvBwkteXDZd1QlO8-UPGZo_OXeEjxlSaef3VINqEU/edit?usp=sharing

usuario_role no MySQL

https://docs.google.com/document/d/1b_SuykcaXE2-KsWXV2_LZyYGqo2dOe4nM3lBp7DYJz0/edit?usp=sharing

a sintaxe do erro

https://docs.google.com/document/d/1Zgy5JXiQVwcqVXrZtzC1OsFAfzVsdTnH9p745PDXjUk/edit?usp=sharing

Oi roberto

está dando permission denied

Otávio não entendi sua resposta?

Gostaria de receber um passo a passo, para que eu possa solucionar o problema?

Você consegue me ajudar com isso?

É que o link que você enviou precisa de acesso, rs https://docs.google.com/document/d/1Zgy5JXiQVwcqVXrZtzC1OsFAfzVsdTnH9p745PDXjUk/edit?usp=sharing

Desculpe!

Você poderia ver se agora consegue acessar ele por favor?

Uma diferença sutil que reparei no seu método procuraUsuario é que voce não removeu a linha "query.setParameter("senha", usuario.getSenha());" igual o instrutor mostrou no vídeo, o correto seria conforme abaixo:

    public Usuario procuraUsuario(Usuario usuario) {
        TypedQuery<Usuario> query = manager
                .createQuery("select u from Usuario u where u.email=:email" ,Usuario.class);
        query.setParameter("email", usuario.getEmail());
        Usuario usuarioRetornado = query.getResultList().stream().findFirst().orElse(null);

        if(validaASenhaDoUsuarioComOHashDoBanco(usuario,usuarioRetornado)) {
            return usuarioRetornado;
        }

        return null;
    }

Outra coisa que pode ser também, nesse erro que você enviou:

Hibernate: select roles0_.Usuario_email as Usuario_1_3_0_, roles0_.roles_name as roles_na2_3_0_, role1_.name as name1_1_1_ from Usuario_Role roles0_ inner join Role role1_ on roles0_.roles_name=role1_.name where roles0_.Usuario_email=?
jul 03, 2020 4:39:51 PM org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() for servlet [dispatcher] in context with path [/alura-shows] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: Invalid salt version; nested exception is java.lang.IllegalArgumentException: Invalid salt version] with root cause
java.lang.IllegalArgumentException: Invalid salt version
    at org.mindrot.jbcrypt.BCrypt.hashpw(BCrypt.java:659)
    at org.mindrot.jbcrypt.BCrypt.checkpw(BCrypt.java:764)
    at br.com.alura.owasp.dao.UsuarioDaoImpl.validaASenhaDoUsuarioComOHashDoBanco(UsuarioDaoImpl.java:49)

Indica que o salt é inválido, dá uma olhada na tabela para ver se a senha foi gravada com o BCrypt conforme:

Otávio, boa tarde!

Conferi a Classe "UsuarioDaoImpl" e percebo que está exatamente igual a do professor, eu assisti a aula varias vezes, a fim de identificar o erro, veja como estão os códigos nela:

https://docs.google.com/document/d/14J0Ni6kXTb6uxrjdh8WaKDtutcStS4PropW-rhoXzXs/edit?usp=sharing

Esse erro é apresentado quando tento fazer login com o Alex - ele já esta registrado.

https://docs.google.com/document/d/1zGkICa4bJeqE_cmt-q3djTcuJ9vXt2j8CBK54DwrBv8/edit?usp=sharing

Este é o erro que aparece quando registro a Ana https://docs.google.com/document/d/1ahiE82itUUeKCYctB33l7Zvk0VPwZcvfb5CePEIonfE/edit?usp=sharing

Note que o nome dela não é salvo no MYSQL, porém quando eu clico em voltar no browser consigo acessar a página de perfil dela como se ela estivesse logada. No entanto ela nem está registrada.

Gostaria que me apontasse se pode haver outra classe em que esse parâmetro pode estar atrapalhando, se você tiver o projeto pode me enviar por favor?

Oi roberto

você pode subir seu projeto no github ou subir no próprio google drive e mandar o link aqui no fórum? vou dar uma analisada com mais cuidado pra você

solução!

Oi roberto

Acho que nem vai precisar subir seu código no drive, eu tentei simular aqui o problema que você está tendo e consegui resolver localmente. A treta é que o instrutor passou a usar o JPA (antes ele estava fazendo um insert na mão usando JDBC e por isso ele não tinha o problema de relacionamento com a tabela usuario_role).

Duas coisas:

  • O email tem que ser único, não tente cadastrar duas vezes o mesmo e-mail, pois vai dar erro de chave primária no MySQL
  • Lá na sua classe Usuario.java muda a anotação do ManyToMany para:
      @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
      private List<Role> roles = new ArrayList<>();
    O segredo tá no "cascade = CascadeType.ALL", ele vai obrigar o relacionamento a fazer o insert lá na tabela usuario_role que estava ficando vazio da forma antiga. Fazendo isso você deve conseguir cadastrar o usuário Ana e vai parar de dar o erro abaixo:
org.hibernate.exception.ConstraintViolationException: could not execute statement] with root cause
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`owasp`.`usuario_role`, CONSTRAINT `FKld5ci4gxlmsruckp707fmygiq` FOREIGN KEY (`roles_name`) REFERENCES `role` (`name`))
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at 

Olá Otávio, boa tarde!

Muito obrigado por seu empenho e desculpe pela trabalheira.

Tivemos um grande progresso quando inseri o código, conforme você me orientou. Embora tenha dado um erro de sintaxe quando a cadastrei - conforme o link abaixo mostra - fui na a´rea de login e consegui logar com ela sem o menor problema.

Tirei um print da tela do MySQL e do UsuarioJava assim como da sintaxe do erro, para que você possa analisar.

Permaneço à disposição para mais informações e para testar novas alternativas caso você ache necessário.

Muitíssimo obrigado e parabéns pela eficácia.

Atenciosamente Roberto Jr.

https://docs.google.com/document/d/1GfFNbrj7zOzokuWUgKVIySkZSQ52tCAt8Mmvl_k_kh4/edit?usp=sharing

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