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

Erro 400 ao enviar formulario

Boa tarde,

Estou desenvolvento um sistema com Spring MVC e uma das partes desse sistema consiste em uma tela com um formulario em que são carregadas opções de escolha de clientes usuarios e uma data. Esses dados são enviados para o servidor onde deveria ocorrer o bind com o parametro do tipo ContaDespesa. Entretanto o comportamento esperado não ocorre e recebo um HTTP Status 400 – Bad Request como resposta.

Segue o código:


[imports omitidos]

@Controller
@RequestMapping("/admin")
public class AdminController {
    @Autowired
    private UsuarioDAO usuarioDao;
    @Autowired
    private ContaDespesaDAO contaDespesaDao;
    @Autowired
    private ClienteDao clientesDao;

[...]


    @RequestMapping("contas/form")
    public ModelAndView formularioCadastroConta() {
        ModelAndView modelAndView = new ModelAndView("admin/cadastro/conta");

        modelAndView.addObject("situacoes", SituacaoConta.values());

        List<Cliente> clientesDisponiveis = clientesDao.listar();

        modelAndView.addObject("clientesDisponiveis", clientesDisponiveis);

        List<Usuario> colaboradoresDisponiveis = usuarioDao.listarColaboradoresAtivos();

        modelAndView.addObject("colaboradoresDisponiveis", colaboradoresDisponiveis);

        return modelAndView;
    }

    @RequestMapping(value = "contas/cadastro", method = RequestMethod.POST)
    public ModelAndView cadastroConta(ContaDespesa conta, RedirectAttributes redirectAttributes) {

        ModelAndView modelAndView = new ModelAndView("redirect:./");

        redirectAttributes.addFlashAttribute("statusCadastro", "Conta criada com sucesso");
        conta.setSituacao(SituacaoConta.ATIVA);
        contaDespesaDao.gravar(conta);

        return modelAndView;
    }
}

form:

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

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Cadastro de conta </title>
</head>
<body>

    <h1>Novo Conta</h1>

    <form action="${s:mvcUrl('AC#cadastroConta').build() }"
        method="POST">
        <div>
            <label for="usuario">Usuario</label> <select id="usuario"
                name="usuario">
                <c:forEach items="${colaboradoresDisponiveis}" var="colaborador">
                    <option value="${colaborador }">${colaborador.nome }</option>
                </c:forEach>
            </select>
        </div>
        <div>
            <label for="cliente">Cliente</label> <select id="cliente"
                name="cliente">
                <c:forEach items="${clientesDisponiveis}" var="cliente">
                    <option value="${cliente }">${cliente.nome }</option>
                </c:forEach>
            </select>
        </div>
        <div>
            <label for="dataInicio">Data de inicio</label> <input type="date" id="dataInicio"
                name="dataInicio" required/>
        </div>
<!--         TODO decidir se data de fim sera inclusa ao criar ou ao finalizar a conta -->

        <button type="submit">Cadastrar Conta</button>

    </form>
</body>
</html>
4 respostas

ContaDespesa

@Entity
public class ContaDespesa {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "id_Sequence")
    @SequenceGenerator(name = "id_Sequence", sequenceName = "ID_SEQ_CONTA_DESPESA")
    private int id;

    @ManyToOne
    private Usuario usuario;

    @ManyToOne
    private Cliente cliente;
    private SituacaoConta situacao;

    @DateTimeFormat
    private Calendar dataInicio;

    @DateTimeFormat
    private Calendar dataFim;

    @OneToMany
    private List<Movimentacao> movimentacoes = new ArrayList<Movimentacao>();
     [getters e setters omitidos]
}

fiz alguns testes aqui e descobri que o problema é causado pelos objetos ques estou pegando dos selects. Como posso contornar esse problema?

Olá Leonardo, boa tarde!

Como sua ContaDespesa possui um Cliente, o JPA vai criar o relacionamento através do id do Cliente. No select da sua view, tente passar o valor do id como value e não o objeto cliente e veja se funciona.

Espero ter ajudado e bons estudos.

solução!

Acabei resolvendo o problema criando um objeto para guardar os dados do form e passando o id do cliente e do colaborador. Pelo que eu entendi, o Spring acaba se perdendo quando o formulario possui dois objetos diferentes no seu envio.