Checar dados antes de inserir com spring

2 respostas
andreacerqueira

Baseado na apostila 21 da Caelum, como eu posso checar se um usuário existe antes de insrir no BD?
Eu faço a consulta e se o usuário existe tenho que encaminhar a pessoa pra outra página diferente, esse é o problema.
No controller está assim:

@RequestMapping("adicionaUsuario")
	public String adiciona(@Valid Usuario usuario, Model model, BindingResult result) {
		model.addAttribute("url_active", "listaUsuarios");
		
		// controle de exceção, se der erro (BindingResult), volta pro formulário
		if (result.hasErrors()) { // erro no formulario inteiro
			return "usuario-formulario";
		}
		
		UsuarioDAO dao = new UsuarioDAO();
		dao.adiciona(usuario);
		return "usuario-adicionado";
	}

No DAO está assim:

public Usuario adiciona(Usuario usuario) {
		String sqlCheck = "SELECT usuario FROM usuarios WHERE usuario = ?";
		try {
			PreparedStatement stmtCheck = this.connection.prepareStatement(sqlCheck);
			stmtCheck.setString(1, usuario.getUsuario());
	        ResultSet rsCheck = stmtCheck.executeQuery();
	        
	        if (rsCheck.next()) {
	        	stmtCheck.close();
	        	System.out.println("Esse usuário já existe.");
		        return null;
	        } else {
	        	String sql = "INSERT INTO usuarios (nome, sobrenome, usuario, senha, data) VALUES (?, ?, ?, ?, ?)";
	        	// prepared statement para inserção
	            PreparedStatement stmt = this.connection.prepareStatement(sql);

	            Calendar calendar = Calendar.getInstance(); // pega a data atual
	    		Date data = new Date(calendar.getTimeInMillis());
	            
	            // seta os valores
	            stmt.setString(1, usuario.getNome());
	            stmt.setString(2, usuario.getSobrenome());
	            stmt.setString(3, usuario.getUsuario());
	            stmt.setString(4, usuario.getSenha());
	            stmt.setDate(5, data);

	            // executa
	            stmt.execute();
	            stmt.close();
	            return usuario;
	        }
		} catch (SQLException e) {
            throw new RuntimeException(e);
        }
}

Ou seja quando dá erro e retorna null e quando o usuário é inserido ele me retorna o usuário.

Agora como faço o controller diferenciar isso e ir pra urls diferentes?

Tentei algo do tipo no controller mas não funcionou:

UsuarioDAO dao = new UsuarioDAO();
dao.adiciona(usuario);
if(dao.equals(null)) {
    return "usuario-erro";
} else {
    return "usuario-adicionado";
}

2 Respostas

marvinla

Olá.
Para redirecionar para uma determinada página, você tem que receber um objeto do tipo Result no controller, e fazer:

result.forwardTo(....);

ou

result.redirectTo(....);

Tem exemplos na apostila também.

Outra coisa, tem um detalhe no código que você postou:

if(dao.equals(null))

Isso não vai produzir o feito desejado, pois você está comparando se o dao é igual a null, e não o usuário que você acabou de cadastrar. O correto seria:

UsuarioDAO dao = new UsuarioDAO();  
Usuario usuario = dao.adiciona(usuario);  
if(usuario == null) {
  ....
}

Falou!

andreacerqueira

Perfeito Marvin :slight_smile:
Mudei o retorno do adiciona() pra Usuario e fiz como vc disse.

UsuarioDAO dao = new UsuarioDAO();
		Usuario novo = dao.adiciona(usuario);
		
		if(novo == null) {
		    return "usuario-erro";
		} else {
		    return "usuario-adicionado";
		}

Obrigado

Criado 29 de setembro de 2012
Ultima resposta 29 de set. de 2012
Respostas 2
Participantes 2