10
respostas

Erro ao clicar no botão alterar dentro do formulario de alterar

Erro:

HTTP Status 400 - type Status report

message description The request sent by the client was syntactically incorrect.

Apache Tomcat/7.0.78

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>


<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>

    <h3>Alterar Contas</h3>
    <form action="alteraConta" method="post">
        Descrição: <br>
        <textarea rows="5" cols="100" name="descricao">${conta.descricao}</textarea> 
        <br><br>

        Valor: <br>
        <input type="text" name="valor" value="${conta.valor}"> 
        <br><br>

        Tipo: <br>
        <select name="tipo">
            <option value="ENTRADA"  ${conta.tipo=='ENTRADA' ? 'selected':''}>Entrada</option>
            <option value="SAIDA"       ${conta.tipo=='SAIDA' ? 'selected':''}>Saída</option>
        </select>

        <br><br>
        Pago? <input type="checkbox" name="paga"     ${conta.paga?'checked':''} />

        <br><br>
        Data de Pagamento: />

        <br><br>

        <input type="hidden" id="id" name="id" value="${conta.id}">
        <input type="submit" value="Alterar Conta">

    </form>
</body>
</html>

@RequestMapping("/alteraConta")
    public String altera(Conta conta) {
        ContaDAO contaDAO = new ContaDAO();
        contaDAO.altera(conta);

        return "redirect:listaConta";
    }




`
10 respostas

Fala Alexandre, tudo bem ?

O server está recusando a requisição (400 - Bad Request), provavelmente dados inválidos para esta action estão chegando no servidor. Tente dar uma olhada na aba network do DevTools como o browser está enviando requisição, o path para o qual está mandando, o conteúdo do form, etc. Tem algo errado.

Outra coisa, perceba que tem um fechamento de tag vazando no seu dentro do seu form, depois do label Data de Pagamento:.

Dê uma olhada nisso e poste aqui qualquer coisa. Abraço!

Rafael,

Eu alterei a minha chamada para:

@RequestMapping("/alteraConta") public String altera(Conta conta) { return "redirect:listaConta"; }

O problema é que eu não consigo receber a Conta no meu metodo.

O que pode ser ?

E isso ocorre somente no alterar.

Isso mesmo Alexandre,

O server não consegue montar uma Conta pra você e devolve um bad request. Inspecione sua página e veja na aba network os dados que o form está enviando pra ver se tem algo errado. Olhando somente o form nao percebi nada.

Poste aqui também como está sua classe Conta, pra termos uma ideia do porque esse objeto não está sendo entregue pelo spring.

boa dica ..

Fui tirando alguns elementos do meu formulario.

E quando tirei a dataPagamento funcionou.

Porem, como eu poderia tratar essa data ?

Opa Alexandre,

Você poderia fazer algo assim:

public class Conta {

    ...
    @DateTimeFormat(pattern="dd/MM/yyyy")
    private Calendar dataDePagamento;

    //get e set pra dataDePagamento
}

Usar um calendar por exemplo pra data, e anotar demonstrando pro Spring qual o padrão da string com a data que virá do formulário.

e no form:

<input type="text" name="dataDePagamento" value="<fmt:formatDate value="${conta.dataDePagamento.time}" pattern="dd/MM/yyyy" />">

Se tiver valor de data, como ela é um Calendar precisa converter pra String adequada com a taglib fmt da JSTL.

Espero ter ajudado. Abraço!

Mas esta assim, conforme o exercício.

E mesmo assim da erro.

Hmm .. estranho

Poste aqui como está atualmente o código. O form, a conta e o controller pra podermos dar uma olhada.

FORM:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>

    <h3>Alterar Contas</h3>
    <form action="alteraConta" method="post">
        Descrição: <br>
        <textarea rows="5" cols="100" name="descricao">${conta.descricao}</textarea> 
        <br><br>

        Valor: <br>
        <input type="text" name="valor" value="${conta.descricao}"> 
        <br><br>

        Tipo: <br>
        <select name="tipo">
            <option value="ENTRADA"  ${conta.tipo=='ENTRADA' ? 'selected':''}>Entrada</option>
            <option value="SAIDA"       ${conta.tipo=='SAIDA' ? 'selected':''}>Saída</option>
        </select>

        <br><br>
        Pago? <input type="checkbox" name="paga"     ${conta.paga?'checked':''} />

        <br><br>
        Data de Pagamento: <input type="text" name="dataPagamento" @@value="<fmt:formatDate value="${conta.dataPagamento.time}" pattern="dd/MM/yyyy" />" />

        <br><br>

        <input type="hidden" id="id" value="${conta.id}">
        <input type="submit" value="Alterar Conta">

    </form>
</body>
</html>

Controller:

package br.com.caelum.contas.controller;

...
@Controller
public class ContaController {

    @DateTimeFormat(pattern="dd/MM/yyyy")
    private Calendar dataPagamento;

    @RequestMapping("/formulario")
    public String formulario() {
        return "conta/formulario";
    }

    @RequestMapping("/formularioAlterar")
    public ModelAndView formularioAlterar(Conta conta) {
        Conta contaDAO = new ContaDAO().buscaPorId(conta.getId());

        ModelAndView modelAndView = new ModelAndView("conta/formulario-alterar");
        modelAndView.addObject("conta", contaDAO);

        return modelAndView;
    }

    @RequestMapping("/adicionaConta")
    public String adiciona(@Valid Conta conta, BindingResult result) {

        if (result.hasFieldErrors("descricao")) {
            return "conta/formulario";
        }

        ContaDAO contaDAO = new ContaDAO();
        contaDAO.adiciona(conta);

        return "conta/conta-adicionada";
    }

    @RequestMapping("/listaConta")
    public ModelAndView lista(Conta conta) {

        List<Conta> contaDAO = new ContaDAO().lista();

        ModelAndView modelAndView = new ModelAndView("conta/lista");
        modelAndView.addObject("todasContas", contaDAO);

        return modelAndView;
    }

    @RequestMapping("/removeConta")
    public String remove(Conta conta) {
        ContaDAO contaDAO = new ContaDAO();
        contaDAO.remove(conta);

        return "redirect:listaConta";
    }


    @RequestMapping("/alteraConta")
    public String altera(Conta conta) {
        ContaDAO contaDAO = new ContaDAO();
        contaDAO.altera(conta);

        return "redirect:listaConta";
    }

}

PS: Coloquei "@@value", nada data pq não tava conseguindo dar submit no formulario do forum !!

Fala Alexandre,

Coloque também como está a classe Conta pra poder entender o possível problema.

...
public class Conta {

    private Long id;

    @NotNull 
    @Size(min=6, message="{conta.formulario.descricao.tamanho}")
    private String descricao;

    private boolean paga;

    private double valor;

    private Calendar dataPagamento;

    private TipoDaConta tipo;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public boolean isPaga() {
        return paga;
    }

    public void setPaga(boolean paga) {
        this.paga = paga;
    }

    public Calendar getDataPagamento() {
        return dataPagamento;
    }

    public void setDataPagamento(Calendar dataPagamento) {
        this.dataPagamento = dataPagamento;
    }

    public TipoDaConta getTipo() {
        return tipo;
    }

    public void setTipo(TipoDaConta tipo) {
        this.tipo = tipo;
    }

    public double getValor() {
        return valor;
    }    

    public void setValor(double valor) {
        this.valor = valor;
    }
}