4
respostas

IllegalArgumentException para alterar Role de usuário

Na pagina de usuários quando seleciona algum usuário para efetuar a troca da role, no momento que tento entrar na JSP de roles eu tomo um Exception. Oque devo fazer ?

Erro genérico acontecendo
java.lang.IllegalArgumentException: Cannot create TypedQuery for query with more than one return using requested result type [br.com.casadocodigo.loja.models.Usuario]
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.resultClassChecking(AbstractEntityManagerImpl.java:396)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:344)
    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.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:347)
    at com.sun.proxy.$Proxy52.createQuery(Unknown Source)
    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.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:298)
    at com.sun.proxy.$Proxy52.createQuery(Unknown Source)
    at br.com.casadocodigo.loja.dao.UsuarioDAO.find(UsuarioDAO.java:53)
    at br.com.casadocodigo.loja.controllers.UsuarioController.alterarRoles(UsuarioController.java:88)
    at br.com.casadocodigo.loja.controllers.UsuarioController$$FastClassBySpringCGLIB$$57e38a12.invoke(<generated>)
4 respostas

Classe UsuarioDAO:

@Repository
public class UsuarioDAO implements UserDetailsService{


    @PersistenceContext
    private EntityManager manager;

    @Autowired
    private ProdutoDAO produtoDao;

    public void gravar(Usuario usuario) {
        manager.persist(usuario);
    }

    public Usuario loadUserByUsername(String email) {
        List<Usuario> usuarios = manager.createQuery("select u from Usuario u where u.email = :email", Usuario.class)
                .setParameter("email", email)
                .getResultList();

        if(usuarios.isEmpty()) {
            throw new UsernameNotFoundException("Usuario " + email + " não foi encontrado");
        }

        return usuarios.get(0);
    }
    public boolean emailExiste(String email) {
         List<Usuario> usuarios = manager.createQuery("select u from Usuario u where u.email = :email", Usuario.class)
                    .setParameter("email", email).getResultList();

            if (!usuarios.isEmpty()) {
                return true;
            } else
                return false;
    }
    public Usuario find(String email) {
        return manager.createQuery("select u.email,u.nome from Usuario u where u.email = :email ", Usuario.class)
                .setParameter("email", email)
                .getSingleResult();
    }
    public List<Object[]> listar() {
        TypedQuery<Object[]> query = manager.createQuery("select u.nome, u.email, ur.nome from Usuario u left join u.roles ur " , Object[].class);
            return query.getResultList();        
    }

    public TypedQuery<Object[]> update(Usuario usuarioSelecionado ) {
        return manager.createQuery("Update Usuario_Role u SET u.role_nome = :u.role WHERE u.email = :u.email;", Object[].class)
        .setParameter("role", usuarioSelecionado);    
    }

    public List<Role> listarRole() {
        TypedQuery<Role> query = manager.createQuery("select nome from Role " , Role.class);
            return query.getResultList();
    }




}

Classe UsuarioController: @Controller public class UsuarioController {

@Autowired
private UsuarioDAO dao;

@Autowired
private FileSaver fileSaver;

@InitBinder
public void initBinder(WebDataBinder binder) {
    binder.addValidators(new UsuarioValidation(dao));
}

@RequestMapping("usuarios/form")
private ModelAndView form(Usuario usuario) {
    ModelAndView modelAndView = new ModelAndView("usuarios/form");
    return modelAndView;
}

@RequestMapping(value = "usuarios/form", method = RequestMethod.POST)
@Transactional
    public ModelAndView gravar(@Valid Usuario usuario, BindingResult result, RedirectAttributes redirectAttributes) {

        if (result.hasErrors()) {
            return form(usuario);
        }

        Role roleUser = new Role("ROLE_USER");
        usuario.setRoles(Arrays.asList(roleUser));
        dao.gravar(usuario);

        redirectAttributes.addFlashAttribute("message", "Usuário " + usuario.getNome() + " cadastrado com sucesso!");

        return new ModelAndView("redirect:/usuarios");
    }

@RequestMapping("/usuarios")
public ModelAndView listar() {
    List<UsuarioVO> usuarios = traduzirParaVo(dao.listar());
    ModelAndView modelAndView = new ModelAndView("/usuarios");
    modelAndView.addObject("usuarios", usuarios);
    return modelAndView;
}
private List<UsuarioVO> traduzirParaVo(List<Object[]> listar) {
    List<UsuarioVO> usuarios = new ArrayList<>();
    for(Object[] o : listar) {
        UsuarioVO uvo = new UsuarioVO();
        uvo.setNome(String.valueOf(o[0]));
        uvo.setEmail(String.valueOf(o[1]));
        uvo.setRoles(Arrays.asList(o[2]));

        usuarios.add(uvo);    
    }
    return usuarios;
}

//Atualizar o usuario com as roles selecionadas @RequestMapping("/roles") public ModelAndView alterarRoles(String email){ Usuario usuario = dao.find(email); List rolesSelecionadas = dao.listarRole();

    ModelAndView modelAndView = new ModelAndView("/roles");
    modelAndView.addObject("usuario", usuario);
    modelAndView.addObject("roles", rolesSelecionadas);

    return modelAndView;
}
    public ModelAndView rolesUpdate(Usuario usuario, RedirectAttributes redirectAttributes ) {
    System.out.println(usuario);    
      List<Role> rolesSelecionadas = dao.listarRole();
    Usuario usuarioSelecionado = dao.find(usuario.getEmail());
    usuarioSelecionado.setRoles(rolesSelecionadas);   
    dao.update(usuarioSelecionado);
    System.out.println("usuario com novas roles selecionadas: " + usuario.getRoles().toString());
    redirectAttributes.addFlashAttribute("massage", "Roles alterada com sucesso!");
    return new ModelAndView("redirect:/usuarios");


}

}

JSP:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<%@ taglib uri="http://www.springframework.org/tags" prefix="s"%>
<%@ taglib uri="http://www.springframework.org/security/tags" prefix="security"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta charset="UTF-8">
<title>Livros de Java, Android, iPhone, Ruby, PHP e muito mais - Casa do Código</title>
<c:url value="/resources/css" var="cssPath" />
<link rel="stylesheet" href="${cssPath}/bootstrap.min.css" />
<link rel="stylesheet" href="${cssPath}/bootstrap-theme.min.css" />
</head>
<body> 
    <nav class="navbar navbar-inverse">
      <div class="container">
        <div class="navbar-header">
          <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
            <span class="sr-only">Toggle navigation</span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
          </button>
          <a class="navbar-brand" href="${s:mvcUrl('HC#index').build()}">Casa do Código</a>
        </div>
        <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
          <ul class="nav navbar-nav">
            <li class="nav-item"><a href="${s:mvcUrl('UC#listar').build()}">Lista de Usuarios</a></li>
            <li class="nav-item"><a href="${s:mvcUrl('UC#form').build()}">Cadastro de Usuarios</a></li>
          </ul>
          <ul class="nav navbar-nav navbar-right">
               <li class="nav-item">
                   <a href="<c:url value="/logout" />">Sair</a></span>
               </li>
               <li class="nav-item">
                   <a href="#">
                       <security:authentication property="principal" var="usuario" />
                       ${usuario.username }
                   </a>
               </li>
          </ul>
        </div><!-- /.navbar-collapse -->
      </div>
    </nav>


<div class="container">

        <h1>Cadastro de Permissoes para ${usuario.nome }</h1>

        <form:form action="${s:mvcUrl('UC#alterarRoles').build() }" method="post" commandName="usuario" enctype="multipart/form-data">
            <div class="form-group">
            <label>Permissoes:</label>
            <form:checkboxes items="${roles }" path="roles" itemLabel="nome"  />
        </div>
            <button type="submit">Atualizar</button>
        </form:form>
    </div>
  </body>
 </html>
O post foi fechado por inatividade após 3 meses. Para continuar o assunto, recomendamos criar um novo tópico. Bons Estudos!

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