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