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

Como criar um usuário por formulário?

Boa tarde, estou com a seguinte dúvida, na aula o professor insere um usuário e senha por sql, mas como faríamos isso por um formulário?

Eu estou criando uma aplicação para empréstimos de chaves e preciso criar um formulário para o cadastro de mais usuários que iram acessar o sistema, visto que inserir os usuários por sql não é nada prático.

Esta é a minha classe Operador (que seria o usuário do sistema):

@Entity public class Operador implements UserDetails {

private static final long serialVersionUID = 1L;

@Id
private String cpf;
private String senha;

@ManyToMany(fetch = FetchType.EAGER)
private List<Role> papeis = new ArrayList<Role>();

@ManyToOne
private Biblioteca biblioteca;

@DateTimeFormat
private Calendar dataCadastro = Calendar.getInstance();
private String operador;
private Calendar modificado;
private Boolean admin;

public void add(Role role) {
    papeis.add(role);
}

public String getCpf() {
    return cpf;
}

public void setCpf(String cpf) {
    this.cpf = cpf;
}

public String getSenha() {
    return senha;
}

public void setSenha(String senha) {
    this.senha = senha;
}

public List<Role> getPapeis() {
    return papeis;
}

public void setPapeis(List<Role> papeis) {
    this.papeis = papeis;
}

public Biblioteca getBiblioteca() {
    return biblioteca;
}

public void setBiblioteca(Biblioteca biblioteca) {
    this.biblioteca = biblioteca;
}

public Calendar getDataCadastro() {
    return dataCadastro;
}

public void setDataCadastro(Calendar dataCadastro) {
    this.dataCadastro = dataCadastro;
}

public String getOperador() {
    return operador;
}

public void setOperador(String operador) {
    this.operador = operador;
}

public Calendar getModificado() {
    return modificado;
}

public void setModificado(Calendar modificado) {
    this.modificado = modificado;
}

public Boolean getAdmin() {
    return admin;
}

public void setAdmin(Boolean admin) {
    this.admin = admin;
}

@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
    return this.papeis;
}

@Override
public String getPassword() {
    return this.senha;
}

@Override
public String getUsername() {
    return this.cpf;
}

@Override
public boolean isAccountNonExpired() {
    // TODO Auto-generated method stub
    return true;
}

@Override
public boolean isAccountNonLocked() {
    // TODO Auto-generated method stub
    return true;
}

@Override
public boolean isCredentialsNonExpired() {
    // TODO Auto-generated method stub
    return true;
}

@Override
public boolean isEnabled() {
    // TODO Auto-generated method stub
    return true;
}

public void addPapel(Role roleCadastrada) { papeis.add(roleCadastrada);

}

}

Este o meu controller:

@Controller public class OperadorController {

@Autowired
private OperadorDAO operadorDao;

@Autowired
private BibliotecaDAO bibliotecaDao;

@Autowired
private RoleDao roleDao;

@RequestMapping("/operador/form")
public ModelAndView form() {
    List<Biblioteca> bibliotecas = bibliotecaDao.listar();
    ModelAndView modelAndView = new ModelAndView("operador/form");
    modelAndView.addObject("bibliotecas", bibliotecas);
    return modelAndView;
}

@RequestMapping("/operador/gravar")
public String gravar(Operador operador, Role role) {

    Role roleCadastrada;
    Operador operadorNovo = operador;
    BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();

    operadorNovo.setSenha(encoder.encode(operador.getSenha()));

    try {

        roleCadastrada = roleDao.find(role.getNome());
             operadorNovo.addPapel(roleCadastrada);

    } catch (NoResultException e) {

        roleDao.gravar(role);
        System.out.println(role.getNome());
                operadorNovo.addPapel(role);

    } finally {

                   operadorDao.gravar(operadorNovo);
    }



    return "/operador/ok";
}

}

Este é o meu DAO:

@Repository public class OperadorDAO implements UserDetailsService {

@PersistenceContext
private EntityManager manager;

public void gravar(Operador operador) {
    manager.persist(operador);

}


public UserDetails loadUserByUsername(String cpf) {
    List<Operador> operadores = manager.createQuery("select o from Operador o where o.cpf = :cpf", Operador.class).setParameter("cpf", cpf).getResultList();

    if(operadores.isEmpty()) {
        throw new UsernameNotFoundException("Operador " + cpf + "não foi encontrado");
    }

    return operadores.get(0);
}

}

Porém ao tentar persistir o novo operador no banco de dados recebo o seguinte erro: Request processing failed; nested exception is javax.persistence.TransactionRequiredException: No transactional EntityManager available

2 respostas

E caso eu insrira o @Transaction no DAO recebo esse erro:

 Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: OperadorDAO conf.SecurityConfiguration.operadorDao; nested exception is java.lang.IllegalArgumentException: Can not set OperadorDAO field conf.SecurityConfiguration.operadorDao to com.sun.proxy.$Proxy38

Alguém poderia me ajudar?

solução!

Oi Paulo,

Sobre o erro:

 Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: OperadorDAO conf.SecurityConfiguration.operadorDao; nested exception is java.lang.IllegalArgumentException: Can not set OperadorDAO field conf.SecurityConfiguration.operadorDao to com.sun.proxy.$Proxy38

Você está tentando fazer o Autowired de uma implementação, tenta trocar pela interface.